更新时间:2023-12-04 23:08:10
你不能用当前的实现。为了达到这个目的,你必须创建一个数组对象(即:一个实现 ArrayAccess
的对象)。例如:
class SuperArray实现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']正在被访问......;
返回$ 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]);
}
公共函数offsetExists($ offset){
return isset($ this-> _data [$ offset]);
}
}
class Test {
protected $ foo;
public function __construct(){
$ array ['bar'] ['hello'] ='world';
$ this-> foo = new SuperArray($ array);
}
公共函数__get($ name){
echo $ name。'正在被访问。'。PHP_EOL;
返回$ this-> $ name;
}
}
$ test = new Test;
echo $ test-> foo ['bar'] ['hello'];
应输出:
正在访问 foo。正在访问
['bar']
['bar'] ['hello']正被访问
world
With an example class such as this:
class Test{
public function &__get($name){
print_r($name);
}
}
An instance of Test
will kick back output as such:
$myTest = new Test;
$myTest->foo['bar']['hello'] = 'world';
//outputs only foo
Is there a way I can get more information about what dimension of the array is being accessed, showing me (from the previous example) that the bar
element of foo
, and the hello
element of bar
are being targeted?
You can't with the current implementation. In order for this to work, you will have to create an array object (i.e.: an object that implements ArrayAccess
). Something like:
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'];
Should output:
foo is being accessed.
['bar'] is being accessed
['bar']['hello'] is being accessed
world