将数组转换为对象以自动化array_key_exists()

时间:2014-04-22 08:33:54

标签: php arrays oop

我需要我的代码不要发出任何通知,所以我写了一个小类来访问数组,而不必一直担心未定义的索引。

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

我只是想知道这是否有任何意想不到的后果,或者我可以将它用于任何阵列并且可以永远幸福地生活吗?

2 个答案:

答案 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);
}