2015-10-01 13 views
14

Vor kurzem sah ich diese Zeile in einem PHP-Stück Code:Was bedeutet PHP Operator -> {...}?

$dbObject = json_decode($jsonString); 
$dbObject->{'mysql-5.4'}[0]->credentials 

Was bedeutet das? Im PHP docs können wir lesen, dass

Beide eckigen Klammern und geschweifte Klammern austauschbar für den Zugriff auf Array-Elemente (zB $ Array verwendet werden [42] und $ array {42} werden beide das gleiche tun, was am Beispiel über).

Aber wie kann das Objekt $ dbObject definiert werden, um ->{...}[...] Zugriff zu ermöglichen? Ist dieser Code unsicher? Welche PHP-Version erlaubt dies?

Habe ich etwas in den PHP-Dokumenten vermisst?

+1

Werfen Sie einen Blick auf diese http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php – usrNotFound

+1

@Dagon Die Frage, wie ursprünglich festgelegt die nicht decken geschweifte Klammern Syntax. Wie könnte das ein Duplikat sein? – feeela

+0

Weiß jemand, in welcher Version von PHP dies eingeführt wurde? –

Antwort

22

Es ist der Zugriff auf Eigenschaften zu ermöglichen, die ungültige Syntax als bare Literale wäre. Bedeutung:

$dbObject->mysql-5.4[0]->credentials 

Dies ist ungültige/mehrdeutige Syntax. Um PHP klar zu machen, dass mysql-5.4 eine Eigenschaft und keine Eigenschaft minus Float ist, müssen Sie die Syntax {'..'} verwenden.

Um genau zu sein, ->{..} können Sie beliebige Ausdruck als Name der Eigenschaft verwenden. Beispiel:

$dbObject->{ sprintf('%s-%.1f', 'mysql', 5.4) } 
+0

Sie können '-' nicht für eine Eigenschaft verwenden. Vielleicht ist eine magische Eigenschaft ('__get') –

+0

Sie können nicht' -' * und eine ganze Menge anderer Zeichen * wie '.' für Eigenschaftsnamen verwenden, da sie keine gültigen Variablennamen darstellen, da sie mit anderen für Betreiber. – deceze

+0

Wow, danke. Hast du eine Referenz dafür? – WeSee

3

Die Syntax der geschweiften Klammern im Beispiel stammt nicht von der Array-Syntax, sondern von einer möglichen Syntax für den Zugriff auf Variablen mit Variablennamen.

Curly-Klammern können ebenfalls verwendet werden, um den Namen der Eigenschaft klar abzugrenzen. Sie sind am nützlichsten beim Zugriff auf Werte innerhalb einer Eigenschaft, die ein Array enthält, wenn der Eigenschaftenname aus mehreren Teilen besteht, oder wenn der Eigenschaftsname Zeichen enthält, die ansonsten nicht gültig sind (z. B. von json_decode() oder SimpleXML) .

Beispiele aus der PHP-Dokumentation:

echo $foo->{$baz[1]} . "\n"; 
echo $foo->{$start . $end} . "\n"; 
echo $foo->{$arr[1]} . "\n"; 

Siehe „PHP Variable Variablen“: http://php.net/manual/en/language.variables.variable.php (Weitere Beispiele für die Verwendung dort ...)

3

Als Ergänzung zu @deceze's answer:

Der Operator -> bedeutet, dass Sie auf eine Objekteigenschaft zugreifen. In diesem Fall sollte der Name der Eigenschaft mysql-5.4 lauten, was kein gültiger PHP-Bezeichner ist (er muss Buchstaben, Zahlen oder Unterstriche enthalten, siehe here). Es ist also 100% sicher, dass der Eigenschaftsname dynamisch erstellt wurde.

PHP ermöglicht das Überladen von Eigenschaften mit magischen Methode namens __get(). Mit dem Hauptteil dieser Methode können Sie jede Eigenschaft bearbeiten, die Sie wünschen - dies kann eine beliebige Zeichenfolge oder eine beliebige Variable sein, sogar ein Objekt, das in eine Zeichenfolge umgewandelt wird.

Also in Ihrem Fall erstellt jemand eine Klasse mit einer __get() magische Methode, die Zeichenfolge mysql-5.4 behandelt. Die geschweiften Klammern { und } werden angegeben, um anzuzeigen, dass die Zeichenfolge als Eigenschaftsname behandelt werden soll (jedoch gibt es keine Eigenschaft mit diesem Namen).

2

Mit der geschweiften Klammer-Syntax können Sie ein Zeichenfolgenliteral oder eine Variable als Eigenschaften- oder Methodennamen verwenden.

Dies aus mehreren Gründen sinnvoll:

  1. (pro @ Deceze Antwort): Es erlaubt Ihnen, Eigenschaftsnamen zuzugreifen, die sonst nicht gültig PHP-Syntax wäre - zum Beispiel, wenn die Eigenschaft Name einen Punkt enthält oder Strich, für dein Beispiel. Normalerweise würden solche Eigenschaften über eine magische __get()-Methode erreicht werden, da sie auch eine ungültige Syntax wären, um sie als eine tatsächliche Eigenschaft innerhalb der Klasse zu definieren.

  2. (per @ fecelas Antwort): Es ermöglicht Ihnen, Variablen zu verwenden, um Ihre Eigenschaften zu referenzieren. Dies ist ähnlich der $$ Variablenvariable Syntax. Es ist im Allgemeinen nicht wirklich eine sehr gute Übung, ist aber in einigen Fällen nützlich.

  3. (noch nicht von anderen Antworten erwähnt): Es ermöglicht Ihnen, bestimmte mögliche Unklarheiten aus Ihrem Code zu entfernen. Betrachten Sie den folgenden Code zum Beispiel:

    $output = $foo->$bar['baz']; 
    

    Dies ist mehrdeutig. Sie können die Mehrdeutigkeit aufzulösen, indem Klammern oder Klammern hinzu:

    $output = $foo->{$bar['baz']}; //gets the value of a property from $foo which has a name that is defined in $bar['baz'] 
    $output = ($foo->$bar)['baz']; //gets the ['baz'] element of $foo->$bar array. 
    

    Dies ist besonders wichtig, weil die bevorstehende relese von PHP 7 wird das Standardverhalten von Code wie wie ändern. Dadurch verhält sich die Sprache konsistenter, jedoch wird vorhandener Code, der keine geschweiften Klammern aufweist, beschädigt.

    Siehe auch die PHP-Dokumentation für diese Änderung hier: https://wiki.php.net/rfc/uniform_variable_syntax

    Aber auch ohne die Sprache ändern, das Problem zu zwingen, Code wie diesen sollte auf jeden Fall hat Klammer mit Lesbarkeit zu helfen - wenn Sie nicht Klammern setzen Dann wirst du vielleicht Schwierigkeiten haben, herauszufinden, was du versucht hast, wenn du in sechs Monaten zum Code zurückkommst.