You cannot with the current implementation. To do this, you will need to create an array object (i.e.: an object that implements ArrayAccess ). Sort of:
class SuperArray implements ArrayAccess { protected $_data = array(); protected $_parents = array(); public function __construct(array $data, array $parents = array()) { $this->_parents = $parents; foreach ($data as $key => $value) { if (is_array($value)) { $value = new SuperArray($value, array_merge($this->_parents, array($key))); } $this[$key] = $value; } } public function offsetGet($offset) { if (!empty($this->_parents)) echo "['".implode("']['", $this->_parents)."']"; echo "['$offset'] is being accessed\n"; return $this->_data[$offset]; } public function offsetSet($offset, $value) { if ($offset === '') $this->_data[] = $value; else $this->_data[$offset] = $value; } public function offsetUnset($offset) { unset($this->_data[$offset]); } public function offsetExists($offset) { return isset($this->_data[$offset]); } } class Test{ protected $foo; public function __construct() { $array['bar']['hello'] = 'world'; $this->foo = new SuperArray($array); } public function __get($name){ echo $name.' is being accessed.'.PHP_EOL; return $this->$name; } } $test = new Test; echo $test->foo['bar']['hello'];
Must output:
foo is being accessed. ['bar'] is being accessed ['bar']['hello'] is being accessed world
source share