PHP-Syntax für geschweifte Klammern für Mitgliedsvariable

79

Erste Frage zu SO und es ist ein echter RTM-Kandidat. Aber ich verspreche dir, ich habe gesucht und kann es nicht finden. Ich mache gerne einen #headpalm, wenn sich herausstellt, dass es eine einfache Sache ist, die ich verpasst habe.

Beim Versuch, Zend Framework herauszufinden, stieß ich auf die folgende Syntax:

$this->_session->{'user_id'}

Ich habe noch nie die Syntax geschweifter Klammern gesehen, mit der auf eine scheinbar Mitgliedsvariable zugegriffen wird. Wie ist es anders als

$this->_session->user_id

Ich gehe davon aus, dass die Sitzung irrelevant ist, aber ich nehme sie in die Frage auf, da dies möglicherweise nicht der Fall ist.

Sind die geschweiften Klammern nur eine Sauberkeitskonvention, die versucht, den zusammengesetzten Variablennamen user_id zu umbrechen? Oder ist es eine Art spezieller Accessor?

Alle Hinweise in TFM, damit ich R up kann, wäre demütig dankbar.

Danke vielmals. Bitte sei höflich.

David Weinraub
quelle
7
Vielen Dank für die schnellen und hervorragenden Antworten. Mit dieser sanften Einweihung in SO werde ich ermutigt, es mehr zu verwenden. Hoffentlich kann ich helfen, Fragen zu beantworten, nicht nur sie zu fragen. Prost.
David Weinraub
1
Interessanter Leckerbissen: Sie können Methoden mit der geschweiften Syntax aufrufen, und das Ergebnis ist so schnell wie das direkte Aufrufen der Methode. Die Verwendung von call_user_func ist allgemeiner, dauert jedoch doppelt so lange, bis call_user_func (Array ($ obj, $ method), "parm1", "parm2") anstelle von $ obj -> {$ method} ("parm1," parm2 ") ausgeführt wird. );
Rolf
Und letzteres ist auch besser lesbar. Zumindest IMO. Tatsächlich $obj->$method($params)
lasse

Antworten:

51

Geschweifte Klammern werden verwendet, um das Ende eines Variablennamens explizit anzugeben. Zum Beispiel:

echo "This square is {$square->width}00 centimeters broad."; 

Ihr Fall ist also wirklich eine Kombination aus zwei Sonderfällen. Sie können mit geschweiften Klammern auf Klassenvariablen zugreifen und so:

$class->{'variable_name'} // Same as $class->variable_name
$class->{'variable' . '_name'} // Dynamic values are also allowed

Und in Ihrem Fall umgeben Sie sie nur mit der Syntax für geschweifte Klammern.

Siehe das PHP-Handbuch "Komplexe (lockige) Syntax".

James Skidmore
quelle
2
Dies ist nicht die Situation, in der $ this -> _ session -> {'user_id'} verwendet wird.
Jimyi
Danke für die schnelle Antwort. Ja, ich nehme die Kopffläche. Ich habe die Syntax unter anderen Umständen verwendet und sie im Kontext von Mitgliedsvariablen einfach nicht erkannt. Schlimmer noch, bei meiner Suche befand ich mich auf dieser Seite im Handbuch, sah aber das Beispiel für die Mitgliedsvariable nicht. Seufz ... Trotzdem war das Beispiel, das ich gegeben habe, ein seltsamer Fall, in dem ich es verwenden sollte, oder? Keine wirkliche Mehrdeutigkeit, keine wirkliche Abgrenzung notwendig. Sicher syntaktisch gültig, aber unnötige Verwendung. Verstehst du, was ich meine?
David Weinraub
2
@ Jimyi, ich habe meine Antwort weiter geklärt. Vielen Dank. @papayasoft, ich stimme zu, dass es in Ihrem Fall ziemlich unnötig ist. Ich vermute, dass es sich um automatisch generierten Code handelt und sie die komplexe geschweifte Syntax verwenden, um alle Basen abzudecken.
James Skidmore
24

Ich kenne die Syntax nur bei Verwendung von Variablenvariablen :

$userProp = 'id';
$this->_session->{'user_'.$userProp};
Gumbo
quelle
1
+1 für die einzige Antwort mit einem richtigen Link zu TFM, wie @jimyi angedeutet hat. Im OP geht es nicht um die komplexe (lockige) Syntax für Strings. Es geht um die Verwendung von geschweiften Klammern, um Mehrdeutigkeiten in variablen Variablen aufzulösen.
Bob Stein
19

Es gibt wahrscheinlich einen großen Vorteil dieser Syntax, sie liegt jedoch im Allgemeinen im Bereich haariger Dinge und Dinge, die Sie wahrscheinlich vermeiden möchten.

Sie können Zeichen in Variablennamen verwenden, die ansonsten nicht zulässig sind.

dh:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 
Kent Fredric
quelle
6
Es muss jedoch nicht so extrem sein wie Ihre Beispiele. Sie können sich beispielsweise vorstellen, dass diese Sitzungsdaten in einer Datenbank gespeichert werden und eine Spalte mit dem Namen "Benutzer-ID" anstelle von "Benutzer-ID" ...
Mercator
2
Bei älteren PHP-Versionen können Sie mit \ 0 am Anfang der Zeichenfolge ISTR auf Pivate-Variablen zugreifen. Jetzt gibt Ihnen mindestens \ 0 die schwerwiegende Ausnahme "Sie können das nicht tun, tut mir leid".
Kent Fredric
12

In dem Beispiel, das Sie geben, gibt es keinen wirklichen Unterschied, und IMO $this->_session->user_idsollte verwendet werden, weil es klarer ist.

Die Syntax für geschweifte Klammern ist eigentlich gut für den Zugriff auf eine Mitgliedsvariable, indem ein Ausdruck für ihren Namen erstellt wird, wie z $this->_session->{'user_id' . $index}.

Chaos
quelle
11

Die beiden Beispiele in Ihrer Frage machen dasselbe. Mit PHP können Sie auf verschiedene Arten auf Mitgliedsdaten / -methoden zugreifen ...

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
Donnie DeBoer
quelle