Wirklich einfache Frage, aber anstatt nach einer wissenschaftlichen Erklärung zu fragen, möchte ich es so pragmatisch wie möglich halten: Wann erstellt PHP eine Kopie meiner riesigen Klasse, die ich in eine Funktion übergebe und wann wird es einfach einen Zeiger auf die relevante Daten? Und wenn es ständig Zeiger erstellt, was nützt es, & (abgesehen von Schließungen, natürlich) zu spezifizieren? Ich schätze, ich weiß nicht genug über den Mut des Dolmetschers.also, wie funktioniert die Weitergabe durch Referenz in PHP wirklich?
Antwort
In PHP 5 werden alle Objekte an ihrem Handle übergeben. Ob Sie als Referenz bestehen oder nicht, ist in Bezug auf die Leistung irrelevant. (In der Tat wird die Weitergabe als Referenz im Handbuch als langsamer bezeichnet.) Das Objekt, an dem Sie innerhalb der Funktion arbeiten, ist das gleiche Objekt wie außerhalb der Funktion.
Wenn Sie ein Objekt (Handle) als Referenz übergeben, können Sie ändern, worauf die äußere Variable zeigt. Dies ist fast immer unnötig.
+1 für Pragmatismus! – kappasims
Nur um klar zu sein, ich spreche nur von Objekten. PHP übergibt eine Kopie aller anderen Datentypen (Strings usw.). Die Kopie wird jedoch nur dann tatsächlich ausgeführt, wenn Sie die Daten ändern. Also wieder sind Referenzen normalerweise nicht "schneller". Ihr eigentlicher Zweck ist, wenn Sie ändern müssen, worauf die Variable im aufrufenden Bereich tatsächlich zeigt. Daher würde ich sie im Allgemeinen vermeiden, es sei denn, Sie benötigen dieses spezifische Verhalten. – Matthew
Der Operator &
bezeichnet eine Variable, die als Referenz übergeben wird.
$x = 'Hello World';
echo($x);
function asdf(&$var){
$var = 'Test';
}
asdf($x);
echo($x);
Das gleiche gilt für die Zuordnung und so ziemlich jede andere Aussage. Wenn es nicht als Referenz übergeben oder zugewiesen wird, wird davon ausgegangen, dass es übergeben oder nach Wert zugewiesen wird.
Danke. Ich glaube, ich interessiere mich nicht so sehr dafür, ob der Wert geändert wird oder nicht, sondern ob ich einen Effizienz-Treffer von diesem Objekt nehmen werde, das dupliziert wird. Ich frage mich, ob dies wirklich einen großen Unterschied macht, da PHP "Kopie beim Schreiben" ist. – kappasims
Verwenden Sie 'microtime()', um zu testen, wie lange ein Objekt benötigt, um zu duplizieren, wie lange es dauert für ein Objekt, das als Referenz übergeben werden soll. Ich glaube nicht, dass es einen großen Unterschied macht, zumindest ist die benötigte Zeit für die kleineren Objekte, die ich geschaffen habe, vernachlässigbar. Das größere Problem ist eher die Funktionalität als die Ausführungszeit. – Cyclone
Habe es und werde es tun. Danke für Ihre Hilfe! – kappasims
Warum stören Sie mit &, obwohl Sie dies als bitte tun können. Dies ist, wie ich tue:
Angenommen, ich habe eine Klasse ‚Buch‘ mit einigen öffentlichen Methoden und Eigenschaften wie Titel, Autor, Jahr dann ein Objekt zu machen, einfach:
$book = new Book()
// then I can use all public methods and properties
$book->title;
$book->author;
$book->year;
Wenn Ich mag dann kann ich eine Unterklasse
class Novel extends Books{
function buildIt(Book $bk){
$bk->title;
// so on
}
}
in der Funktion BuildIT sagen lassen, ich eine Klasse mit Absicht Objekt des Buchs ‚Parameter‘, in der ich das ganze Objekt der Klasse ‚Buch‘ passieren kann.
Ich hoffe diese Hilfe.
Sicher, meine Frage ist, dass, wenn Sie $ bk-> Titel referenzieren, das in ein neues temporäres Buch mit einem ganz neuen $ Titel im Speicher kopiert wird, der ohne Auswirkungen auf das ursprüngliche Buchobjekt geändert werden kann, und Wenn das der Fall ist, ist das schlecht für die Leistung, das Objekt zu duplizieren? – kappasims
Objekte werden standardmäßig übergeben, daher ist es in Ihren Beispielen bedeutungslos. Wenn Sie jedoch primitive Datentypen übergeben (z. B. Integer, String usw.), ist dies der richtige Zeitpunkt. – netcoder
Sie können viele Verwendungen einer Variablen durch Verweis im PHP-Handbuch finden. Eines der besten Beispiele ist preg_match.
preg_match
gibt die Anzahl der Vorkommen eines Musters in der Eingabezeichenfolge zurück. Es wird dann, falls angegeben, ein referenziertes $matches
Array mit den Übereinstimmungen aufgefüllt.
Es kann als eine Möglichkeit gesehen werden, mehr als einen Wert zurückzugeben, obwohl Sie damit vorsichtig sein sollten. Beispiel:
class Server {
protected $_clientId = 0;
protected $_clients = array();
/**
* Get a pending connection.
*
* @param &$connection_id int The connection identifier.
* @return resource The socket resource.
*/
public function getNextClient(&$connection_id) {
$clientSocket = socket_accept($this->_server);
$connection_id = $this->_clientId++;
$this->_clients[$connection_id] = $clientSocket;
return $clientSocket;
}
}
$server = new Server;
$socket1 = $server->getNextClient($id);
echo $id; // 0
$socket2 = $server->getNextClient($id);
echo $id; // 1
Wichtiger Hinweis. Objekte werden standardmäßig als Verweis übergeben. Sie werden nicht geklont. Auch ohne Angabe des &
im Argument function führt das Ändern des übergebenen Objekts dazu, dass das ursprüngliche Objekt ebenfalls geändert wird. Die einzige Möglichkeit, dies zu verhindern, ist das Klonen des Objekts in der Funktion/Methode.
Große Antwort. Vielen Dank! – kappasims
- 1. Problem mit der Weitergabe durch Referenz
- 2. Verbessert die Weitergabe von Werten durch Referenz die Geschwindigkeit signifikant?
- 3. per Referenz funktioniert nicht in PHP
- 4. Weitergabe per Referenz in Java?
- 5. Weitergabe von Datenelementen per Referenz
- 6. Weitergabe der Variablen an PHP durch Javascript
- 7. Stack und Weitergabe per Referenz
- 8. Datenbankverbindung durch Referenz in PHP übergeben
- 9. PHP-Pass-Array durch Referenz
- 10. Automatische Rückgabe durch Referenz in PHP
- 11. Wie funktioniert die HAVING-Klausel wirklich?
- 12. Weitergabe von http.ResponseWriter nach Wert oder Referenz?
- 13. Weitergabe von PHP in jQuery
- 14. Weitergabe von Fehlermeldungen in PHP
- 15. Wie funktioniert JavaScript [] wirklich?
- 16. Wie funktioniert "biosdevname" wirklich?
- 17. Wie funktioniert die Bindung an Sammlungen wirklich?
- 18. Referenz PHP-Array durch mehrere Indizes
- 19. Wie Eigen: Matrix durch Referenz
- 20. Wie XSS-Angriff wirklich funktioniert?
- 21. PHP-Referenz pass
- 22. 2D Dynamische Array-Zuweisung und Weitergabe nach Referenz in C
- 23. swift: durch Referenz
- 24. Unveränderliche Werttypen durch Referenz standardmäßig übergeben
- 25. Weitergabe von Daten durch Intent mit Serializable
- 26. Funktioniert Flash10 + P2P wirklich?
- 27. Erfassung durch universelle Referenz
- 28. Weitergabe der PHP Session ID an die FLEX App
- 29. Android - Weitergabe von Arrays durch onClick
- 30. php Weitergabe Ausgabe in eine Variable
Was ist falsch an dieser Erklärung? http://www.php.net/manual/en/language.references.whatare.php – RobertPitt
Die einzige Sache, die mit dieser Erklärung falsch ist, ist anscheinend das Intelligenzniveau seines Publikums (ich) – kappasims
Versuchen Sie, sie in Ihrem Code zu vermeiden, da diese Eigenschaft in neueren Versionen von PHP – Nazariy