Es scheint, dass in PHP Objekte als Referenz übergeben werden. Selbst Zuweisungsoperatoren scheinen keine Kopie des Objekts zu erstellen.
Hier ist ein einfacher, erfundener Beweis:
<?php
class A {
public $b;
}
function set_b($obj) { $obj->b = "after"; }
$a = new A();
$a->b = "before";
$c = $a; //i would especially expect this to create a copy.
set_b($a);
print $a->b; //i would expect this to show 'before'
print $c->b; //i would ESPECIALLY expect this to show 'before'
?>
In beiden Druckfällen bekomme ich "nach"
Wie übergebe ich $ a an set_b () als Wert und nicht als Referenz?
php
copy
clone
shallow-copy
Nick Stinemates
quelle
quelle
(object) ((array) $objectA)
Möglicherweise erhalten Sie dieselben gewünschten Ergebnisse mit einer besseren Leistung als mitclone $objectA
odernew stdClass
.Antworten:
In PHP 5+ werden Objekte als Referenz übergeben. In PHP 4 werden sie als Wert übergeben (aus diesem Grund wurde die Laufzeit als Referenz übergeben, was veraltet war).
Sie können den 'Klon'-Operator in PHP5 verwenden, um Objekte zu kopieren:
Außerdem werden nur Objekte als Referenz übergeben, nicht alles, was Sie in Ihrer Frage gesagt haben ...
quelle
$a = new stdClass; $b =& $a; $a = 42; var_export($b);
Hier$b
ist ein Verweis auf die Variable$a
; Wenn Sie durch=&
ein normales Objekt ersetzen=
, handelt es sich nicht um eine Referenz und verweist weiterhin auf das ursprüngliche Objekt.Die Antworten finden Sie häufig in Java-Büchern.
Klonen: Wenn Sie die Klonmethode nicht überschreiben, ist das Standardverhalten eine flache Kopie. Wenn Ihre Objekte nur primitive Elementvariablen haben, ist dies völlig in Ordnung. Aber in einer typenlosen Sprache mit einem anderen Objekt als Mitgliedsvariablen bereitet es Kopfschmerzen.
Serialisierung / Deserialisierung
$new_object = unserialize(serialize($your_object))
Dies führt zu einer tiefen Kopie mit hohen Kosten, abhängig von der Komplexität des Objekts.
quelle
$a = clone $b
ohne magische__clone()
Methoden im Spiel) entspricht dem Betrachten jeder Eigenschaft eines Objekts$b
im Begriff und dem Zuweisen derselben Eigenschaft in einem neuen Mitglied derselben Klasse unter Verwendung von=
. Eigenschaften, die Objekte sind, erhalten wederclone
d noch Objekte innerhalb eines Arrays. das gleiche gilt für durch Referenz gebundene Variablen; Alles andere ist nur ein Wert und wird wie bei jeder Aufgabe kopiert.Call to method __clone from invalid context
:)$new_date = (clone $date_start)->subDays(1);
Es schlägt fehl mit()
, wenn ich sie entferne, bekomme ich einen anderen Fehler. Die Sache ist, wir verwenden genau das gleiche PHP 7.2.3 und meins funktioniert gut. Irgendwelche Ideen? Überall gesucht ..Wenn Sie laut vorherigem Kommentar ein anderes Objekt als Mitgliedsvariable haben, gehen Sie wie folgt vor:
Jetzt können Sie klonen:
quelle
Laut den Dokumenten ( http://ca3.php.net/language.oop5.cloning ):
quelle
Nur um zu verdeutlichen, dass PHP beim Schreiben kopiert wird, ist im Grunde alles eine Referenz, bis Sie es ändern. Für Objekte müssen Sie jedoch den Klon und die magische Methode __clone () wie in der akzeptierten Antwort verwenden.
quelle
Dieser Code hilft beim Klonen von Methoden
quelle
Ich habe einige Tests durchgeführt und Folgendes erhalten:
quelle
In diesem Beispiel erstellen wir eine iPhone- Klasse und erstellen durch Klonen eine exakte Kopie davon
quelle
Wenn Sie die Eigenschaften eines Objekts in einer anderen Instanz vollständig kopieren möchten, können Sie diese Technik verwenden:
Serialisieren Sie es in JSON und de-serialisieren Sie es dann wieder in Object.
quelle