PHP 5.6+。有一个类。
class PropertyContainer {
protected $_data;
public $somePublicArray = [0];
public function __construct($data = [])
{
$this->_data = $data;
}
public function __get($name)
{
return array_key_exists($name, $this->_data) ? $this->_data[$name] : null;
}
public function __set($name, $value)
{
$this->_data[$name] = $value;
}
public function __unset($name)
{
unset($this->_data[$name]);
}
public function __isset($name)
{
return array_key_exists($name, $this->_data);
}
}
$_data如果属性未在类中声明,则通过魔术方法和内部数组使用类属性- 这是一种相当标准的方法。如果不是[] =PHP 中操作符的奇怪方法,一切都会很棒:我们进行了测试
$cont = new PropertyContainer(['a' => 1, 'b' => [0], 'c' => new ArrayObject ([0])]);
$cont->a++; /*$cont->a = 2 OK*/
$cont->b[] = 1; /*$cont->b = [0] FAIL*/
$cont->somePublicArray[] = 1; /*$cont->somePublicArray = [0,1] OK*/
$cont->c[] = 1; /*$cont->c = ArrayObject [0,1] OK*/
var_dump($cont, is_array($cont->c));
die();
也就是说,里面包含的数组$_data不是按引用返回的。
问题是 - 有什么方法可以解决这个问题,并使用运算符[] =填充内部数组,而不是大量使用ArrayObjectinstead of array?面临同样的问题,但这些解决方案不适用于将任意类型的数据存储在内部数组中(如$_data)——我想按原样将数据存储在数组(或 ArrayObject)中。
在使用ArrayObject中,我不喜欢 is_array() 方法不起作用,也许您可以覆盖该行为is_array ?
如果&__get改为使用__get- 是否可以返回指向数组元素的指针$_data?否则,它只是一个警告Only variable references should be returned by reference。
选项 1:如果您不需要支持未声明的属性:
这个版本有一个错误:
方案二:修复了第一个方案的bug,但是
_data如果有尝试获取未声明的属性,会变得杂乱无章。