Der detaillierte Code lautet wie folgt:
<?php final class Registry { private $data = array(); public function get($key) { return $this->data[$key]; } public function set($key, $value) { $this->data[$key] = $value; } } abstract class Controller { protected $registry; public function construct($registry) { $this->registry = $registry; } } class ControllerCommonHome extends Controller { public function test() { $this->registry->set('load','load'); } } $registry = new Registry(); $con = new ControllerCommonHome($registry); $con->test(); echo $registry->get('load'); ?>
Wie wird der Parameter $registry übergeben, wenn $conobject initialisiert wird? Wert übergebenoder Adresse? Wenn es als Wert übergeben wird und das $con-Objekt die Funktion test() ausführt, sollte es sich nicht auf das ursprüngliche Objekt $registry auswirken, sondern tatsächlich auf den Wert der Registrierung.
Aber wenn ich $registry in eine einfache Variable ändere, z. B. $registry = 123, und $registry im $con-Objekt einen Wert zuweise, hat dies dieses Mal keine Auswirkungen auf die ursprüngliche Variable, die immer noch 123 ist.
Lösen
Okay, clone() Konstruktor. Der Grund für das Klonen ist, dass Sie den vorherigen Status nicht ändern möchten.
Objekte sind keine allgemeinen Variablen. Bitte lesen Sie den folgenden Abschnitt der Google-Suche
Objektübergabe
PHP5 verwendet Zend Engine II, Objekte werden in einer unabhängigen Struktur Object Store gespeichert, anstatt wie andere allgemeine Variablen in Zval gespeichert zu werden (in PHP4 werden Objekte wie allgemeine Variablen in Zval gespeichert). ). In Zval wird nur der Zeiger des Objekts gespeichert und nicht der Inhalt (Wert). Wenn wir ein Objekt kopieren oder ein Objekt als Parameter an eine Funktion übergeben, müssen wir die Daten nicht kopieren. Behalten Sie einfach den gleichen Objektzeiger bei und lassen Sie einen anderen zval den Objektspeicher benachrichtigen, auf den dieses bestimmte Objekt jetzt zeigt. Da sich das Objekt selbst im Objektspeicher befindet, wirken sich alle Änderungen, die wir daran vornehmen, auf alle zval-Strukturen aus, die Zeiger auf das Objekt enthalten – was sich im Programm manifestiert, da sich alle Änderungen am Zielobjekt auf das Quellobjekt auswirken. .Dadurch sehen PHP-Objekte so aus, als würden sie immer als Referenz (Referenz) übergeben, sodass Objekte in PHP standardmäßig als „Referenz“ übergeben werden und Sie nicht mehr & verwenden müssen, um es wie in PHP4 zu deklarieren.
Über ein solches Problem habe ich noch nie nachgedacht. Ich habe erst nach Informationen gesucht, nachdem ich Ihre Frage gesehen habe.
Das obige ist der detaillierte Inhalt vonLösung für das Problem der Klassenkonstruktorparameter in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!