Pregunta

Después de haber hecho un poco de investigación, al final me encontré con la respuesta a una pregunta que era muy pronto para preguntar aquí de todos modos; ¿Cómo se trabaja con matrices a través de los métodos mágicos __get y __set en PHP? Cada vez que yo estaba tratando de establecer un valor de usar algo como $object->foo['bar'] = 42; parecía descartar silenciosamente a él.

En cualquier caso, la respuesta es simple; El método __get simplemente tiene que devolver por referencia. Y después de lanzar un símbolo de unión frente a ella, efectivamente funciona.

Mi pregunta en realidad, es la razón? Me parece que no puede entender por qué esto está funcionando. ¿Cómo __get retorno por referencia afecta de trabajo __set con matrices multidimensionales?

Edit: Por cierto, se ejecuta PHP 5.3.1

¿Fue útil?

Solución

En este caso particular, se __set en realidad no recibiendo llamadas. Si usted analiza lo que esto ocurra, se debe hacer un poco más de sentido:

$tmp = $object->__get('foo');
$tmp['bar'] = 42

Si __get no devolvió una referencia, a continuación, en lugar de asignar al índice 42 'barra' del objeto original, estás se asigna al índice 'barra' de un Copiar de la objeto original.

Otros consejos

En PHP cuando regrese un valor de una función se puede considerar que se hace una copia de ese valor (a menos que sea una clase). En el caso de __get a menos que devuelva la cosa real que desea editar, todos los cambios se realizan en una copia que se desecha a continuación.

tal vez más claro:

//PHP will try to interpret this:
$object->foo['bar'] = 42

//The PHP interpreter will try to evaluate first 
$object->foo

//To do this, it will call 
$object->__get('foo')
// and not __get("foo['bar']"). __get() has no idea about ['bar']

//If we have get defined as &__get(), this will return $_data['foo'] element 
//by reference.
//This array element has some value, like a string: 
$_data['foo'] = 'value';

//Then, after __get returns, the PHP interpreter will add ['bar'] to that
//reference.
$_data['foo']['bar']

//Array element $_data['foo'] becomes an array with one key, 'bar'. 
$_data['foo'] = array('bar' => null)

//That key will be assigned the value 42
$_data['foo']['bar'] = 42

//42 will be stored in $_data array because __get() returned a reference in that
//array. If __get() would return the array element by value, PHP would have to 
//create a temporary variable for that element (like $tmp). Then we would make 
//that variable an array with $tmp['bar'] and assign 42 to that key. As soon 
//as php would continue to the next line of code, that $tmp variable would 
//not be used any more and it will be garbage collected.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top