PHP中echo和print都是输出的做用,可是二者之间仍是有细微的差异。echo输出后没有返回值,但print有返回值,当其执行失败时返回flase。所以能够做为一个普通函数来使用,例如执行$r = print "Hello World"; 变量$r的值将为1。并且代码中echo语句的运行效率要略快于print语句。php
PHP中空字符串和NULL都是以值为0存储的,可是他们的类型并不同,前者是string,然后者是NULL,可见字符串('')、NULL值相等但类型不等。数据库
二者都属于比较运算符,==(等于)只比较值是否相等,而===(全等于)则不但比较值是否相等,还会比较类型是否相等,它更为严格。编程
include()与require()的功能也基本相同,但在用法上也有一些不一样,include()是有条件包含函数,而require()则是无条件包含函数。例如在下面代码中,若是变量$a为真,则将包含文件a.php:
if($a){
include("a.php");
}
而require()则和include()不一样,无论$a取何值,下面的代码都会把文件a.php包含:
if($a){
require("a.php");
}
在错误处理方面,使用include语句,若是发生包含错误,程序将跳过include语句,虽然会显示错误信息可是程序仍是会继续执行。可是,requre语句会提示一个致命错误。数组
empty是判断一个变量是否为“空”,而isset则是判断一个变量是否已经被设置。函数
在访问PHP类中的成员变量或方法时,若是被引用的变量或者方法被声明成const(常量)或者static(静态属性),那么就必须使用域操做符::,而若是被引用的变量或者方法没有被声明成const或者static,那么就使用指向操做符->。ui
在foreach循环中,若是咱们须要更改迭代的元素或是为了提升效率,运用引用是一个好办法:this
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8)
这里有个问题不少人会迷糊。循环结束后,$value并未销毁,$value实际上是数组中最后一个元素的引用,这样在后续对$value的使用中,若是不知道这一点,会引起一些莫名奇妙的错误:)看看下面这段代码:编码
$array = [1, 2, 3]; echo implode(',', $array), "\n";
指针
foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n";
code
foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n";
上面代码的运行结果以下:
1,2,3
1,2,3
1,2,2
你猜对了吗?为何是这个结果呢?
咱们来分析下。第一个循环事后,$value是数组中最后一个元素的引用。第二个循环开始:
第一步:复制$arr[0]到$value(注意此时$value是$arr[2]的引用),这时数组变成[1,2,1]
第二步:复制$arr[1]到$value,这时数组变成[1,2,2]
第三步:复制$arr[2]到$value,这时数组变成[1,2,2]
综上,最终结果就是1,2,2
避免这种错误最好的办法就是在循环后当即用unset函数销毁变量:
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3]
php编程中,在处理非ascii字符时,会遇到一些问题,要很当心的去对待,要否则就会错误遍地。举个简单的例子,strlen($name),若是$name包含非ascii字符,那结果就有些出乎意料。在此给出一些建议,尽可能避免此类问题:若是你对unicode和utf-8不是很了解,那么你至少应该了解一些基础。推荐阅读这篇文章。最好使用mb_*函数来处理字符串,避免使用老的字符串处理函数。这里要确保PHP的“multibyte”扩展已开启。数据库和表最好使用unicode编码。知道jason_code()函数会转换非ascii字符,但serialize()函数不会。php代码源文件最好使用不含bom的utf-8格式。 在此推荐一篇文章,更详细的介绍了此类问题: UTF-8 Primer for PHP and MySQL