Wolfi: unbekannte Schreibweise mit geschweiften Klammern

Hallo an alle.

Ich beschäftige mich jetzt schon eine Weile mit PHP, bin aber noch ein Anfänger. Mir ist jetzt eine Codezeile untergekommen, die ich nicht so recht interpretieren kann. Vielleicht kann mir das ja einer erklären.

$page = new PAGE() // $page ist ein riesiges Array  
$page->{'main'}['sub']['cont'] = 'abc'

Was macht diese Codezeile? Sucht die in den weiten des Arrays nach einem Schlüssel 'main'? Wenn ja warum dann nicht eckige Klammern, statt der Geschweiften.

Bitte um Hilfe.

Vielen Dank
Gruß Wolfi

  1. Hi,

    $page = new PAGE() // $page ist ein riesiges Array

    $page->{'main'}['sub']['cont'] = 'abc'

    
    >   
    > Was macht diese Codezeile?  
      
    Grundsätzlich braucht man die geschweiften Klammern an Stellen, an denen man auf Eigenschaften/Methoden zugreifen möchte, deren Name keinen in PHP gültigen Bezeichner darstellen.  
    Das kann z.B. passieren, wenn man sich das Ergebnis einer Datenbank-Abfrage als Objekte liefern lässt. Ein Spaltenname wie "foo bar" lässt sich natürlich nicht über `$obj->foo bar`{:.language-php} ansprechen, das würde der Interpreter nicht verstehen.  
    Also kann man an solchen Stellen zur geschweifte-Klammern-um-Literal-Schreibweise greifen – `$obj->{'foo bar'}`{:.language-php}  
      
    Das ist das generelle Prinzip – nur in deinem Beispiel ist die Verwendung eher sinnfrei, denn `$page->main['sub']['cont'] = 'abc'`{:.language-php} hätte es dort ebenso getan.  
      
    Außer einem Literal kann man natürlich auch den Namen einer Variablen angeben, wenn man dynamisch auf eine Eigenschaft/Methode zugreifen möchte. (Dazu braucht man dann aber idR. die geschweiften Klammern nicht, `$obj->{$foo}`{:.language-php} und `$obj->$foo`{:.language-php} wären äquivalent.) Das hat aber einen ähnlichen Unsauberkeitsfaktor wie variable Variablen, deshalb versucht man sowas zu vermeiden.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Danke für die Antwort.

      Mich hat es nur verwirrt, da es keine Funktion/Variable mit dem Bezeichner "main" (im gesamten Projekt) gibt. Es taucht nur diese Codezeile in dem Projekt (in ein paar Variationen) auf. Ich nehme also an, dass der das Array so erstellt. Wofür es gebraucht wird, weiß ich auch nicht. Schon komisch -.-