Mit __set mit Arrays gelöst, aber warum?
-
29-09-2019 - |
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
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.