Синтаксис фігурних дужок 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.