我需要我的代码不要发出任何通知,所以我写了一个小类来访问数组,而不必一直担心未定义的索引。
class ArrayAsObject
{
private $array;
public function __construct(&$array) {
$this->array = &$array;
}
public function __get($key)
{
if (array_key_exists($key, $this->array)) {
return $this->array[$key];
} else {
return null;
}
}
}
$fruits = array ('apples' => 42);
$fruits = new ArrayAsObject($fruits);
echo $fruits->apples; // 42
echo $fruits->lemons; // null
我只是想知道这是否有任何意想不到的后果,或者我可以将它用于任何阵列并且可以永远幸福地生活吗?
答案 0 :(得分:2)
应该是
$arr = array ('apples' => 42);
$fruits = new ArrayAsObject($arr);
而不是
$fruits = ArrayAsObject(array ('apples' => 42));
您没有使用new关键字并直接传递数组(只有变量可以通过引用传递),这将导致通知。
答案 1 :(得分:2)
我会从ArrayObject类延伸到这样:
class MyArrayObject extends ArrayObject{
public function offsetGet($name) {
if($this->offsetExists($name))
return parent::offsetGet($name);
}
}
使用函数offsetGet()
可以访问数组数据,因此如果调用$myObjectArray['test']
,则调用该函数。然后,如果您使用offsetExists()
检查是否已设置密钥,则会返回该值。否则结果将为null
修改强>
如果你想将它也用作一个对象,你需要添加这两个函数:
public function __get($name){
return $this->offsetGet($name);
}
public function __set($name, $value){
$this->offsetSet($name, $value);
}