81

关于 SO 的第一个问题,它是一个真正的 RTM 候选人。但我向你保证,我已经看过但似乎找不到。当事实证明这是我错过的一件简单的事情时,我会很高兴地做一个#headpalm。

试图弄清楚 Zend Framework 并遇到以下语法:

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

我从未见过用于访问似乎是成员变量的花括号语法。和有什么不同

$this->_session->user_id

我假设 _session 无关紧要,但将其包含在问题中,因为它可能不相关。

花括号是否只是尝试包装复合变量名称 user_id 的清洁约定?或者它是某种特殊的访问器?

任何指向 TFM 的指针,以便我可以 R up 将不胜感激。

非常感谢。请温柔一点。

4

5 回答 5

54

花括号用于显式指定变量名的结尾。例如:

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 手册,“复杂(卷曲)语法”。

于 2009-07-18T16:23:21.927 回答
24

我只知道使用变量变量时的语法:

$userProp = 'id';
$this->_session->{'user_'.$userProp};
于 2009-07-18T16:24:07.947 回答
20

该语法可能有一个很大的优势,但是,它通常在多毛的东西领域,以及您可能想要避免的事情。

它允许您在变量名中使用其他不允许的字符。

IE:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 
于 2009-07-18T16:32:57.553 回答
13

在您给出的示例中,没有真正的区别,$this->_session->user_id应该使用 IMO,因为它更清晰。

花括号语法实际上的好处是通过为其名称构造表达式来访问成员变量,例如$this->_session->{'user_id' . $index}.

于 2009-07-18T16:46:43.017 回答
11

您问题中的两个示例做同样的事情。PHP 允许您以多种方式访问​​成员数据/方法...

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
于 2009-07-18T16:28:10.543 回答