Frage

ein wenig Forschung getan zu haben, kam ich schließlich über die Antwort auf eine Frage, die ich bald war hier sowieso fragen; Wie arbeiten Sie mit Arrays über die __get und __set magischen Methoden in PHP? Jedes Mal, wenn ich versuche, einen Wert zu setzen so etwas wie $object->foo['bar'] = 42; mit schien es ihn leise zu entledigen.

Wie auch immer, ist die Antwort einfach; Die __get Methode muss lediglich unter Bezugnahme zurückzukehren. Und nach einem kaufmännischen vor ihm sicher genug werfen funktioniert es.

Meine Frage eigentlich ist, warum? Ich kann nicht scheinen zu verstehen, warum dies funktioniert. Wie funktioniert __get durch Bezugnahme Rückkehr beeinflussen __set Arbeiten mit mehrdimensionalen Arrays?

Edit: Übrigens, läuft PHP 5.3.1

War es hilfreich?

Lösung

In diesem speziellen Fall wird __set eigentlich nicht genannt zu werden. Wenn Sie brechen, was es geschieht, sollte es ein bisschen mehr Sinn machen:

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

Wenn __get keinen Verweis zurückgekommen, dann anstelle von 42 zur ‚bar‘ Index des ursprünglichen Objekts zuweisen, sind Sie in die ‚Bar‘ Index einer werden die Zuordnung Kopie von der Original-Objekt.

Andere Tipps

In PHP, wenn Sie einen Wert aus einer Funktion zurückgeben können Sie es für eine Kopie dieses Wertes zu machen (es sei denn es eine Klasse ist). Im Fall von __get es sei denn, Sie die tatsächliche Sache zurückkehren Sie bearbeiten möchten, werden alle Änderungen an einer Kopie gemacht, die dann verworfen wird.

vielleicht mehr klar:

//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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top