Синтаксис фігурних дужок PHP для змінної-члена


79

Перше запитання щодо SO, і це справжній кандидат у RTM. Але я обіцяю тобі, що я шукав і, здається, не можу його знайти. Я із задоволенням зроблю #headpalm, коли це виявиться простою штукою, яку я пропустив.

Намагаючись з’ясувати Zend Framework, натрапив на такий синтаксис:

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

Я ніколи не бачив синтаксису фігурних дужок, що використовується для доступу до того, що здається змінною члена. Чим це відрізняється від

$this->_session->user_id

Я припускаю, що _session не має значення, але включаючи його у питання, оскільки це може бути не так.

Чи є фігурні дужки лише умовою чистоти, яка намагається обернути складну назву змінної user_id? Або це якийсь спеціальний аксесуар?

Будь-які вказівки на TFM, щоб я міг піднятись, були б вдячні.

Дуже дякую. Будь ласка, будь ласка.


7
Дякую всім за швидкі та чудові відповіді. З цим ніжним посвяченням у SO мені пропонується використовувати його більше. Сподіваюся, я можу допомогти відповісти на запитання, а не просто запитати їх. Ура.
Девід Вайнроб

1
Цікавий ласий шматок: Ви можете викликати методи з фігурним синтаксисом, і результат буде таким же швидким, як виклик методу безпосередньо. Використання call_user_func є більш загальним, але це вимагає вдвічі більше часу, щоб зробити call_user_func (масив ($ obj, $ method), "parm1", "parm2") замість $ obj -> {$ method} ("parm1," parm2 " );
Рольф

І останнє теж читабельніше. Принаймні ІМО. Насправді, я часто опускаю фігурні дужки в назві методу в такому випадку:$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

Дякую за швидку відповідь. Так, я візьму головну долоню. Я використовував синтаксис за інших обставин, просто не розпізнав його в контексті змінних-членів. Навіть гірше, у своєму пошуку я був на цій сторінці в посібнику, але не бачив вибірки змінної члена. Зітхання ... Тим не менше, приклад, який я навів, був якось дивним випадком, коли його можна було використовувати, так? Жодної реальної двозначності, ніякого реального розмежування не потрібно. Безумовно, синтаксично допустиме, але своєрідне непотрібне використання. Розумієте, що я маю на увазі?
David Weinraub

2
@jimyi, я уточнив свою відповідь далі. Дякую. @papayasoft, я згоден, що у вашому випадку це досить непотрібно. Я припускаю, що це автоматично згенерований код, і вони використовують складний фігурний синтаксис лише для того, щоб охопити всі основи.
James Skidmore

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 дає вам фатальний виняток "не можна цього робити".
Kent Fredric

12

У наведеному прикладі немає реальної різниці та IMO $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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.