2006-09-14

PHP之怪现象

下面总结一些我发现的PHP的奇怪事情:

1.array()并非引用类型
array()并非一个对象的构造函数,它是一个语言结构,它返回的虽然是一个结合数组,但并非一个对象,即时在所谓OO的PHP5中,也是有问题的:
$a = array(...);
$b = $a;
print $b === $a;
这时候,确实输出为1,表示两者一致,PHP的手册上是这么说的:
$a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE
$a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE
所以,===对于对象来说,才是同一性比较
如果这时修改$b的某个值,那么$b就和$a不等了
$b[0] = 5;
print $b === $a;
这时什么也不输出,表示为false
如果要获取$a的引用,必须强制性地使用&操作符
$b =& $a;
由此引出了2

2. foreach和each()等数组操作

foreach($arr as $k => $v)表示遍历$arr中的每个元素$e,同样的,这个$v是=出来的,相当于$arr[$k] = $v,而非$arr[$k] =& $v,并非$arr中的实际元素,那就有两种情况:
  1. $arr[$k]这个元素正好是一个对象,这时其中存储的其实是一个引用,那么$v可以正确指向最终的对象
  2. 之外所有的类型,都是一个副本,如果是一个数组,那么是数组的副本
因此,如果要实际改变$arr中的元素,应当使用$arr[$k],而非$v。
这种问题同样可出现在其他数组操作,each(),current()等。
2. include和eval
include和eval哪个快?
答案是eval快,这个确实比较奇怪,即使算上文件操作,纯粹执行代码,eval(file_get_contents($file))要比include快那么一点。
问题可能在于include要处理<?php ?>这些东西,而eval仅处理php代码。
其它的以后再慢慢总结

没有评论: