php一开始是面向过程的语言,到后期才支持面向对象,数组在php中的类型是 “array”:
echo gettype(array());
输出
array
很多操作数组的函数都是以 “array” 开头,第一个参数为要操作的数组。
要实现一个数组类,需要实现ArrayAccess这个接口,这个接口的功能是 “提供像访问数组一样访问对象的能力” ,该接口有四个方法:
abstract public boolean offsetExists ( mixed $offset )
abstract public mixed offsetGet ( mixed $offset )
abstract public void offsetSet ( mixed $offset , mixed $value )
abstract public void offsetUnset ( mixed $offset )
这四个函数的作用如下(假设$obj是一个实现了该接口的类的实例):
- offsetExists, 执行isset( $obj[$key])时触发
- offsetGet,获取$obj[$key]时触发
- offsetSet, 执行 $obj[$key] = $value时触发
- offsetUnset, 执行unset($obj[$key])时触发
看上去有点类似C++的运算符重载。我们可以封装一个类,以一个数组变量作为其私有属性,这四个函数操作数组变量就行。
且看代码:
我们把这个类命名为XArray。
class XArray implements ArrayAccess{
private $container = array();
public function __construct($size = 0, $value = 0) {
if ($size > 0) {
$this->container = array_fill(0, $size, $value);
}
}
public function offsetSet($offset, $value) {
echo "call ", __METHOD__, PHP_EOL;
if(is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetUnset($offset) {
echo "call ", __METHOD__, PHP_EOL;
unset($this->container[$offset]);
}
public function offsetGet($offset) {
echo "call ", __METHOD__, PHP_EOL;
return isset($this->container[$offset]) ?