Es gibt zwei verschiedene Möglichkeiten, auf Methoden in PHP zuzugreifen, aber was ist der Unterschied?
$response->setParameter('foo', 'bar');
und
sfConfig::set('foo', 'bar');
Ich gehe davon aus, dass ->
(Bindestrich mit mehr als Vorzeichen oder Chevron) für Funktionen für Variablen und ::
(Doppelpunkt) für Funktionen für Klassen verwendet wird. Richtig?
Wird der =>
Zuweisungsoperator nur zum Zuweisen von Daten innerhalb eines Arrays verwendet? Steht dies im Gegensatz zu dem =
Zuweisungsoperator, mit dem eine Variable instanziiert oder geändert wird?
Antworten:
Wenn der linke Teil eine Objektinstanz ist, verwenden Sie
->
. Ansonsten verwenden Sie::
.Dies bedeutet, dass dies
->
hauptsächlich für den Zugriff auf Instanzmitglieder verwendet wird (obwohl es auch für den Zugriff auf statische Mitglieder verwendet werden kann, von einer solchen Verwendung wird abgeraten), während::
es normalerweise für den Zugriff auf statische Mitglieder verwendet wird (obwohl es in einigen besonderen Fällen für den Zugriff auf Instanzmitglieder verwendet wird ).Im Allgemeinen
::
wird für verwendet Umfang Auflösung , und es kann entweder ein Klassennamen haben,parent
,self
, oder (in PHP 5.3)static
auf seiner linken Seite.parent
bezieht sich auf den Umfang der Oberklasse der Klasse, in der sie verwendet wird;self
bezieht sich auf den Umfang der Klasse, in der sie verwendet wird;static
bezieht sich auf den "aufgerufenen Bereich" (siehe späte statische Bindungen ).Die Regel ist, dass ein Aufruf mit
::
genau dann ein Instanzaufruf ist, wenn:$this
vorhanden ist und$this
ist entweder die Klasse der aufgerufenen Methode oder eine Unterklasse davon.Beispiel:
Ausgabe:
quelle
->
wird hauptsächlich für den Zugriff auf Instanzmitglieder verwendet (obwohl es auch für den Zugriff auf statische Mitglieder verwendet werden kann, wird von einer solchen Verwendung abgeraten)" Ich wusste nicht, dass dies möglich ist. Wenn es also beim Zugriff auf statische Elemente auf irgendeine Weise "funktioniert" - welchen Unterschied im Verhalten würde man erwarten, wenn man es so falsch verwendet? Nur aus Neugier.->
. Natürlich müssen Sie möglicherweise die Klasse instanziieren, um eine statische Methode aufzurufen. Daher gibt es auch einen Leistungseinbruch. Bei Eigenschaften gibt es jedoch weitere Probleme. Eine STRICT-Warnung wird ausgelöst und funktioniert möglicherweise oder nicht . Beachten Sie, dass auch das Gegenteil der Fall ist - Sie können eine Instanzmethode statisch aufrufen, dies ist jedoch noch schlimmer (und Sie können sie$this
in einer solchen Methodenimplementierung nicht verwenden ).::
wird im statischen Kontext verwendet, dh. Wenn eine Methode oder Eigenschaft als statisch deklariert ist:Außerdem wird der
::
Operator (der Scope Resolution Operator, auch bekannt als Paamayim Nekudotayim ) im dynamischen Kontext verwendet, wenn Sie eine Methode / Eigenschaft einer übergeordneten Klasse aufrufen:->
wird im dynamischen Kontext verwendet, dh. Wenn Sie sich mit einer Instanz einer Klasse befassen:Übrigens: Ich denke nicht, dass die Verwendung von Symfony eine gute Idee ist, wenn Sie keine OOP-Erfahrung haben.
quelle
Tatsächlich können wir mit diesem Symbol eine Klassenmethode aufrufen, die statisch ist und nicht von anderen Initialisierungen abhängig ist ...
Hier ist die
doWrite()
Funktion von keiner anderen Methode oder Variablen abhängig und es handelt sich um eine statische Methode. Deshalb können wir diese Methode von diesem Operator aufrufen, ohne das Objekt dieser Klasse zu initialisieren.Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.
Wenn Sie die
write
Methode jedoch auf diese Weise aufrufen möchten , wird ein Fehler generiert, da er von der Initialisierung abhängt.quelle
Der
=>
Operator wird verwendet, um Schlüssel-Wert-Paare in einem assoziativen Array zuzuweisen. Beispielsweise:Die Bedeutung ist in der
foreach
Aussage ähnlich :quelle
Der Unterschied zwischen statischen und instanziierten Methoden und Eigenschaften scheint eines der größten Hindernisse für diejenigen zu sein, die gerade erst mit OOP PHP in PHP 5 beginnen.
Der Doppelpunktoperator (auf Hebräisch Paamayim Nekudotayim genannt - Trivia) wird verwendet, wenn ein Objekt oder eine Eigenschaft aus einem statischen Kontext aufgerufen wird . Dies bedeutet, dass eine Instanz des Objekts noch nicht erstellt wurde.
Der Pfeiloperator ruft umgekehrt Methoden oder Eigenschaften auf, die aus einer Referenz einer Instanz des Objekts stammen.
Statische Methoden können besonders in Objektmodellen nützlich sein, die zum Erstellen und Löschen von Methoden mit einer Datenbank verknüpft sind, da Sie den Rückgabewert auf die eingefügte Tabellen-ID setzen und dann das Konstruktor verwenden können, um das Objekt anhand der Zeilen-ID zu instanziieren.
quelle
Ja, ich habe gerade meinen ersten Treffer erzielt
'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'
. Mein schlechtes, ich hatte ein$instance::method()
das hätte sein sollen$instance->method()
. Wie dumm von mir.Das Seltsame ist, dass dies auf meinem lokalen Computer (mit PHP 5.3.8) immer noch einwandfrei funktioniert - nichts, nicht einmal eine Warnung mit error_reporting = E_ALL - aber überhaupt nicht auf dem Testserver, da es nur mit einem Syntaxfehler explodiert und ein weißer Bildschirm im Browser. Da die PHP-Protokollierung auf dem Testcomputer deaktiviert war und das Hosting-Unternehmen zu beschäftigt war, um sie einzuschalten, war dies nicht allzu offensichtlich.
Ein Wort der Warnung: Anscheinend können Sie bei einigen PHP-Installationen eine $ instance :: method () verwenden, bei anderen nicht.
Wenn jemand erläutern kann, warum das so ist, tun Sie dies bitte.
quelle