2010-12-28 8 views
2

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?

+2

Was ist falsch an dieser Erklärung? http://www.php.net/manual/en/language.references.whatare.php – RobertPitt

+1

Die einzige Sache, die mit dieser Erklärung falsch ist, ist anscheinend das Intelligenzniveau seines Publikums (ich) – kappasims

+0

Versuchen Sie, sie in Ihrem Code zu vermeiden, da diese Eigenschaft in neueren Versionen von PHP – Nazariy

Antwort

2

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.

+0

+1 für Pragmatismus! – kappasims

+0

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

0

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.

+0

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

+1

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

+0

Habe es und werde es tun. Danke für Ihre Hilfe! – kappasims

0

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.

+0

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

+0

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

0

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.

+0

Große Antwort. Vielen Dank! – kappasims