Składnia nawiasów klamrowych PHP dla zmiennej składowej

79

Pierwsze pytanie na temat SO i jest to prawdziwy kandydat na RTM. Ale obiecuję ci, że szukałem i nie mogę tego znaleźć. Z radością zrobię # headpalm, gdy okaże się, że jest to prosta rzecz, której przegapiłem.

Próbując rozgryźć Zend Framework i natrafiłem na następującą składnię:

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

Nigdy nie widziałem składni nawiasów klamrowych używanej do uzyskiwania dostępu do czegoś, co wydaje się być zmienną składową. Czym różni się od

$this->_session->user_id

Zakładam, że sesja _ jest nieistotna, ale uwzględniam ją w pytaniu, ponieważ może nie być.

Czy nawiasy klamrowe są tylko konwencją czystości, która próbuje opakować nazwę zmiennej złożonej user_id? A może to jakiś specjalny dodatek?

Wszelkie wskazówki dotyczące TFM, abym mógł R up, byłyby pokornie docenione.

Wielkie dzięki. Proszę bądź delikatny.

David Weinraub
źródło
7
Dziękuję wszystkim za szybkie i doskonałe odpowiedzi. Dzięki tej delikatnej inicjacji w SO zachęcam do częstszego jej używania. Mam nadzieję, że pomogę odpowiedzieć na pytania, a nie tylko je zadać. Twoje zdrowie.
David Weinraub,
1
Ciekawa ciekawostka: Możesz wywoływać metody za pomocą składni kręconej, a wynik jest tak szybki, jak bezpośrednie wywołanie metody. Użycie call_user_func jest bardziej ogólne, ale wykonanie call_user_func (array ($ obj, $ method), "parm1", "parm2") zajmuje dwa razy dłużej niż $ obj -> {$ method} ("parm1," parm2 " );
Rolf,
Ta ostatnia też jest bardziej czytelna. Przynajmniej IMO. Właściwie często pomijam nawiasy klamrowe w nazwie metody w tym przypadku:$obj->$method($params)
David Weinraub.

Odpowiedzi:

51

Nawiasy klamrowe służą do jawnego określenia końca nazwy zmiennej. Na przykład:

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

Więc twoja sprawa to tak naprawdę połączenie dwóch specjalnych przypadków. Masz dostęp do zmiennych klas za pomocą nawiasów klamrowych i tak dalej:

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

W twoim przypadku po prostu otaczasz je składnią nawiasów klamrowych.

Zobacz podręcznik PHP , „złożona (kędzierzawa) składnia”.

James Skidmore
źródło
2
To nie jest sytuacja, w której używana jest $ this -> _ session -> {'user_id'}.
jimyi
Dziękuję za szybką odpowiedź. Tak, wezmę głowę. Użyłem składni w innych okolicznościach, po prostu nie rozpoznałem jej w kontekście zmiennych składowych. Co gorsza, podczas wyszukiwania byłem na tej stronie w podręczniku, ale nie widziałem próbki zmiennej składowej. Ech ... Mimo to, podany przeze mnie przykład był dość dziwnym przypadkiem, w którym należy go użyć, prawda? Żadna prawdziwa dwuznaczność, żadne prawdziwe wytyczenie nie jest konieczne. Z pewnością poprawne składniowo, ale niepotrzebne użycie. Widzisz, o co mi chodzi?
David Weinraub
2
@jimyi, wyjaśniłem dalej moją odpowiedź. Dzięki. @papayasoft, zgadzam się, że w twoim przypadku jest to raczej niepotrzebne. Domyślam się, że jest to kod generowany automatycznie i używają złożonej składni kędzierzawej tylko po to, aby pokryć wszystkie podstawy.
James Skidmore
24

Znam składnię tylko wtedy, gdy używam zmiennych zmiennych :

$userProp = 'id';
$this->_session->{'user_'.$userProp};
Gumbo
źródło
1
+1 za jedyną odpowiedź z odpowiednim linkiem do TFM, jak zasugerował @jimyi. OP nie dotyczy złożonej (kręconej) składni dla łańcuchów. Chodzi o użycie nawiasów klamrowych do rozwiązywania niejednoznaczności zmiennych zmiennych.
Bob Stein
19

Prawdopodobnie istnieje jedna duża zaleta tej składni, jednak generalnie jest ona w domenie włochatych rzeczy i rzeczy, których prawdopodobnie chcesz uniknąć.

Pozwala na używanie znaków w nazwach zmiennych, które w innym przypadku są niedozwolone.

to znaczy:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 
Kent Fredric
źródło
6
Jednak nie musi to być tak ekstremalne, jak twoje przykłady. Na przykład, możesz sobie wyobrazić, że dane sesji są przechowywane w bazie danych, a kolumna o nazwie „identyfikator_użytkownika” zamiast „identyfikator_użytkownika”…
mercator
2
Ponadto, w starszych wersjach PHP umieszczenie \ 0 na początku łańcucha znaków ISTR umożliwia dostęp do zmiennych pivate. Teraz przynajmniej \ 0 daje ci fatalny wyjątek "nie możesz tego zrobić, przepraszam".
Kent Fredric
12

W podanym przykładzie nie ma prawdziwej różnicy i $this->_session->user_idnależy użyć IMO, ponieważ jest bardziej przejrzysty.

W rzeczywistości składnia nawiasów klamrowych jest dobra, to uzyskanie dostępu do zmiennej składowej poprzez skonstruowanie wyrażenia dla jej nazwy, na przykład $this->_session->{'user_id' . $index}.

chaos
źródło
11

Dwa przykłady w twoim pytaniu robią to samo. PHP umożliwia dostęp do danych / metod członków na kilka sposobów ...

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
Donnie DeBoer
źródło