本文来自冰山上的播客:http://xinsync.xju.edu.cn/index.php/archives/4476
还是值得记录一下,虽然效果一样,但正因为优先级的不同,导致结果可能会和预料中的值有偏差,虽然实际应用中不太用得到但,看看还是好的
原文:
PHP中&&和and都是逻辑运算符,且功能也是完全一样的。如果你不了解它俩的区别,你可能会留下很不容易发现的BUG。仔细看下面的代码片段(注释是执行结果):
<?php
$true = TRUE;
$false = FALSE;
$rt1 = $true && $false;//$rt1:FALSE
$rt2 = $true and $false;//$rt2:TRUE
var_dump($rt1);//FALSE
var_dump($rt2);//TRUE
var_dump($true && $false);//FALSE
var_dump($true and $false);//FALSE
这里最让人感到奇怪的就是为什么$rt1成了FALSE,而$rt2却是TRUE。其实这是PHP优先级在作怪。从文档中我们看到,赋值符号”=”的优先级低于逻辑与符号”&&”,但高于逻辑与符号”and”(也就是&& > = > and)。也就是说:
$rt1 = $true && $false;
$rt2 = $true and $false;
在PHP看来其实是:
$rt1 = ($true && $false);
($rt2 = $true) and $false;
这样就容易解释为什么会有那样的结果了。那现在你知道下面两句的结果了吗?
var_dump($rt1 = $true && $false);
var_dump($rt2 = $true and $false);
参考资料:
PHP Operator Precedence
PHP Logical Operators
phpED算是老牌PHPIDE了,几年前用过,这几天重拾起来又是一翻风味。
几年前,PHPED最大的垢病就是不支持中文,每次删中文时,都是不见了一半字符,从那时候起我就基本放弃了。
这两天又有人推荐他,于是我重新下载进行安装。说一下简单的用后感吧。
界面啥的也就不提了,反正几乎所有的IDE都那样,有点不同的是PHPED多了一点HTML控件的快速插入,屏幕右侧的快捷工具栏中有一些比较常用的DB连接、SSH连接、MANUAL手册等,这些还是相对比较方便的。
编辑代码时,如果是PHP和HTML混编,两种代码的颜色还是很分明的。
DEBUG的时候还是需要使用它的dbg listener,并且需要在服务器上使用它自己的dbg的组件,并加入PHP.ini,才可以进行调试。
启动速度的话,不能算快,但是ZS比起来,速度还是有明显优势的。
自动提示功能的响应速度可以忍受,对中文的支持没有什么大的问题。
自动模版完成,是按ctrl+J,定义模版变量有点郁闷,因为他的编辑PHP4和PHP5分别用了不同的模版,如果你起初没有选定为PHP5,他就会默认调用PHP4的模版
缺点当然也有:
1、自动提示(自动完成)有时候会突然出不来,必须再重新刷新一下workspace就出来了。妖
2、注释代码没有快捷键,当然可以自定义,但ctrl+/却无法定义,很多IDE里都是使用它为注释的快捷键,上手一下子不习惯了。最后我定义成CTRL+M,但,不习惯
3、所有国外IDE的通病,部分快捷键与切换中文输入有冲突
4、对于project的管理不如其他IDE
5、我个人最不舒服的是,对于使用了rewrite功能做dispatch的框架,无法进行调试,例如ZF,或许是我不会调试吧?
其他情况下的应用基本没什么大问题。函数定义的跳转还是比较准确的,选中函数按F1可以跳到函数说明(手册好象有点老)
一般我们在设置数据库字符集的时候,都是用mysql_query('set names utf8')这样来处理,但其实这样处理的不全,象discuz等都是采用了全部的操作,它是这样的:mysql_query('character_set_connection=utf8, character_set_results=utf8 character_set_client=binary'),也只有这样,才会比较全面。
仔细看手册 ,手册上也这样写着:
Note: This is the preferred way to change the charset. Using mysql_query() to execute SET NAMES .. is not reccomended.
那么,我们该怎么处理呢?从PHP5.2.3开始多了一个函数,它就是:mysql_set_charset,你可以:
PHP代码
- <?
- $conn = ....
- if( mysql_client_encoding ( $conn) != 'utf8' ){
- mysql_set_charset('utf8');
- }
这样才是比较推荐的用法。不过,这样的用法也是有要求的,手册告诉我们:
Note: This function requires MySQL 5.0.7 or later.
传说需要采用这样的方法,是因为set names在某些字符集的时候有安全隐患。
以前也曾经说过,IBM的Developer网站上对于open source之类的介绍比较多,在这些介绍中,也有一部份关于PHP的,这两天在仔细的查找资料时,发现了一个页面,它就是IBM的PHP资源页面,这是对一些PHP资料进行的归档,通过本页,你可以查询一些比较经典的文章。
URL为:http://www.ibm.com/developerworks/cn/opensource/top-projects/php-resources.html
复制一部分如下:
并不全哦,要全的话,还是点最上那个PHP资源的链接,HOHO
用file_get_contents来进行POST?很妖吧。
我也没有想到还有这种妖的东西。在向东的博客上看到这个的:http://www.xiangdong.org/blog/post/1623/
回忆未来?别惊讶,用他的话来说是山寨D。
原文:
file_get_contents.php: Post数据
PHP代码
- <?php
- function Post($url, $post = null)
- {
- $context = array();
-
- if (is_array($post))
- {
- ksort($post);
-
- $context['http'] = array
- (
- 'method' => 'POST',
- 'content' => http_build_query($post, '', '&'),
- );
- }
-
- return file_get_contents($url, false, stream_context_create($context));
- }
-
- $data = array
- (
- 'name' => 'test',
- 'email' => 'test@gmail.com',
- 'submit' => 'submit',
- );
-
- echo Post('http://localhost/5-5/request_post_result.php', $data);
- ?>
接收数据:
request_post_result.php 接收经过Post的数据:
PHP代码
- <?php
- echo $_POST['name'];
- echo $_POST['email'];
- echo $_POST['submit'];
- echo "fdfd";
- ?>
看一下,里面有一个特别的函数:stream_context_create,翻开手册看了一下,也没说什么呀,只是说:Creates and returns a stream context with any options supplied in options
preset.
而file_get_contents呢?它说:
Note: Context support was added with PHP 5.0.0. For a description of contexts, refer to Reference CLX, Stream Functions.
关于Stream Functions,手册上这么描述的。。。
A wrapper is additional code which tells the stream how to handle specific protocols/encodings. For example, the http wrapper knows how to translate a URL into an HTTP/1.0 request for a file on a remote server. There are many wrappers built into PHP by default (See Appendix O), and additional, custom wrappers may be added either within a PHP script using stream_wrapper_register(), or directly from an extension using the API Reference in Chapter 52. Because any variety of wrapper may be added to PHP, there is no set limit on what can be done with them. To access the list of currently registered wrappers, use stream_get_wrappers().
A stream is referenced as: scheme
://target
-
scheme
(string) - The name of the wrapper to be used. Examples include: file, http, https, ftp, ftps, compress.zlib, compress.bz2, and php. See Appendix O for a list of PHP built-in wrappers. If no wrapper is specified, the function default is used (typically file://).
-
target
- Depends on the wrapper used. For filesystem related streams this is typically a path and filename of the desired file. For network related streams this is typically a hostname, often with a path appended. Again, see Appendix O for a description of targets for built-in streams.