Синтаксис фигурных скобок PHP для переменной-члена

79

Первый вопрос по SO, и это настоящий кандидат на RTM. Но обещаю, я искал и, кажется, не нашел. Я с радостью сделаю хедпалм, когда окажется, что это простая вещь, которую я пропустил.

Пытался разобраться в Zend Framework и наткнулся на следующий синтаксис:

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

Я никогда не видел синтаксиса фигурных скобок, используемого для доступа к тому, что кажется переменной-членом. Чем это отличается от

$this->_session->user_id

Я предполагаю, что _session не имеет значения, но включаю его в вопрос, поскольку это может быть не так.

Фигурные скобки - это всего лишь соглашение о чистоте, которое пытается обернуть составное имя переменной user_id? Или это какой-то особый аксессуар?

Любые указатели на TFM, чтобы я мог R up, были бы скромно признательны.

Большое спасибо. Пожалуйста, будьте нежны.

Дэвид Вайнрауб
источник
7
Спасибо всем за быстрые и отличные ответы. С этим мягким посвящением в SO я поощряю использовать его больше. Надеюсь, я смогу помочь ответить на вопросы, а не просто их задать. Ура.
Дэвид Вайнрауб
1
Интересный лакомый кусочек: вы можете вызывать методы с фигурным синтаксисом, и результат будет таким же быстрым, как и прямой вызов метода. Использование call_user_func является более общим, но выполнение call_user_func (array ($ obj, $ method), "parm1", "parm2") вместо $ obj -> {$ method} ("parm1," parm2 "занимает в два раза больше времени. );
Rolf
И последнее тоже более читабельно. По крайней мере, ИМО. На самом деле, в этом случае я часто опускаю фигурные скобки в имени метода:$obj->$method($params)
Дэвид Вайнрауб

Ответы:

51

Фигурные скобки используются для явного указания конца имени переменной. Например:

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

Итак, ваш случай действительно представляет собой комбинацию двух особых случаев. Вам разрешен доступ к переменным класса, используя фигурные скобки и тому подобное:

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

А в вашем случае вы просто окружаете их синтаксисом фигурных скобок.

См. Руководство по PHP , «сложный (фигурный) синтаксис».

Джеймс Скидмор
источник
2
Это не та ситуация, в которой используется $ this -> _ session -> {'user_id'}.
jimyi
Спасибо за быстрый ответ. Да, я возьму хэдпалм. Я использовал синтаксис в других случаях, просто не распознал его в контексте переменных-членов. Хуже того, в моем поиске я был на той странице в руководстве, но не увидел образец переменной-члена. Вздох ... Тем не менее, пример, который я привел, был странным случаем для его использования, верно? Никакой реальной двусмысленности, никакого реального разграничения не требуется. Конечно, синтаксически корректно, но используется излишне. Понимаете, что я имею в виду?
Дэвид Вайнрауб
2
@jimyi, я уточнил свой ответ дальше. Благодарю. @papayasoft, я согласен, что в вашем случае это совершенно не нужно. Я предполагаю, что это автоматически сгенерированный код, и они используют сложный фигурный синтаксис, чтобы охватить все основы.
Джеймс Скидмор,
24

Я знаю синтаксис только при использовании переменных переменных :

$userProp = 'id';
$this->_session->{'user_'.$userProp};
Гамбо
источник
1
+1 за единственный ответ с правильной ссылкой на TFM, как намекнул @jimyi. OP не о сложном (фигурном) синтаксисе для строк. Речь идет об использовании фигурных скобок для устранения неоднозначности в переменных переменных.
Bob Stein
19

Вероятно, есть одно большое преимущество этого синтаксиса, но, как правило, он относится к области волосатых вещей и вещей, которых вы, вероятно, хотите избежать.

Это позволяет вам использовать символы в именах переменных, которые в противном случае не разрешены.

то есть:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 
Кент Фредрик
источник
6
Однако он не должен быть таким экстремальным, как ваши примеры. Например, вы можете представить, что эти данные сеанса хранятся в базе данных, а столбец с именем «user-id» вместо «user_id» ...
mercator
2
Кроме того, в более старых версиях PHP размещение \ 0 перед строкой ISTR позволяет получить доступ к сводным переменным. Теперь по крайней мере \ 0 дает вам фатальное исключение "вы не можете сделать это, извините".
Кент Фредрик
12

В приведенном вами примере нет реальной разницы, и ИМО $this->_session->user_id следует использовать , потому что это более понятно.

На самом деле синтаксис фигурных скобок хорош для доступа к переменной-члену путем создания выражения для ее имени, например $this->_session->{'user_id' . $index}.

хаос
источник
11

Два примера в вашем вопросе делают то же самое. PHP позволяет вам получить доступ к данным / методам членов несколькими способами ...

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
Донни ДеБур
источник