如果您计划从 ArrayObject 派生自己的类,并希望保持完整的 ArrayObject 功能(例如能够转换为数组),则必须使用 ArrayObject 自己的私有属性“storage”。
由于无法直接执行此操作,因此必须使用 ArrayObject 的 offset{Set,Get,Exists,Unset} 方法来间接操作它。
作为一项额外的好处,这意味着您将继承所有迭代和其他功能,并处于完全工作状态。
对于从未实现过自己的 ArrayObject 类的用户来说,这听起来可能很明显...... 但事实并非如此。
<?php
class MyArrayObject extends ArrayObject {
static $debugLevel = 2;
static public function sdprintf() {
if (static::$debugLevel > 1) {
call_user_func_array("printf", func_get_args());
}
}
public function offsetGet($name) {
self::sdprintf("%s(%s)\n", __FUNCTION__, implode(",", func_get_args()));
return call_user_func_array(array(parent, __FUNCTION__), func_get_args());
}
public function offsetSet($name, $value) {
self::sdprintf("%s(%s)\n", __FUNCTION__, implode(",", func_get_args()));
return call_user_func_array(array(parent, __FUNCTION__), func_get_args());
}
public function offsetExists($name) {
self::sdprintf("%s(%s)\n", __FUNCTION__, implode(",", func_get_args()));
return call_user_func_array(array(parent, __FUNCTION__), func_get_args());
}
public function offsetUnset($name) {
self::sdprintf("%s(%s)\n", __FUNCTION__, implode(",", func_get_args()));
return call_user_func_array(array(parent, __FUNCTION__), func_get_args());
}
}
$mao = new MyArrayObject();
$mao["name"] = "bob";
$mao["friend"] = "jane";
print_r((array)$mao);
?>
如果您希望使用“数组作为属性”标志,只需在构造函数中包含此标志即可。
<?php parent::setFlags(parent::ARRAY_AS_PROPS); ?>
这将允许您执行以下示例中的操作,而无需覆盖 __get 或 __set。
<?php
$mao->name = "Phil";
echo $mao["name"]; ?>