2006-09-15

PHP之怪现象(2)

在前面一篇文章PHP之怪现象 中,说到了array()是值复制而非引用的,那么要使用引用的数组,要怎么办呢,PHP5引入的奇特的Standard PHP Library
其中有一个ArrayObject,可以实现引用的数组:
$a = array(1,2,3);
$arrobj = new ArrayObject($a);
这样就可以得到一个行为基本和原始array()一样的一个ArrayObject实例,你也可对其进行foreach操作,不过和基本的array()有一些区别:

  1. 大多数array相关的函数不能使用,如count(),必须使用ArrayObject的count()方法,象array_push() array_pop()等则无法使用
  2. 对ArrayObject使用[]取出某个值的时候,如$arrobj['a'],如果要对这个值进行处理如--、++、[]=等操作,不能使用链式表达式,必须先将这个值取到某个变量中才能使用,如下是错误的:
    $arrobj[1]++; $arrobj[0]--; $arrobj[2][0] = 1;

  3. ArrayObject的性能比array()的性能差很多,慢一倍多点

说完了ArrayObject,还要说一下和ArrayObject密切相关的另一个东西ArrayIterator,一个数组的迭代器。很难说明SPL的目的到底是什么。下面先看看SPL的一张类图



如此复杂的类图,第一眼看,觉得很象Java,但PHP没有OOP中万物之本的Object类(其实如果用类型转换的object转换,是可以得到一个奇怪的stdClass的实例,但没人知道这是干什么用的),如果说是像C++,又少了GP的支持,而PHP低下的运行效率――不要说和Java比,就是和Lua比,也差太多了,谁敢使用这么庞大复杂的类库呢?

没有评论: