成员变量的PHP大括号语法

Dav*_*aub 79 php variables syntax curly-braces

关于SO的第一个问题,它是一个真正的RTM候选者.但我保证你看起来似乎无法找到它.我很乐意做一个#headpalm,结果证明这是一个我错过的简单事情.

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

$this->_session->{'user_id'}
Run Code Online (Sandbox Code Playgroud)

我从未见过用于访问看似成员变量的花括号语法.它有什么不同

$this->_session->user_id
Run Code Online (Sandbox Code Playgroud)

我假设_session是无关紧要的,但将其包括在问题中,因为它可能不是.

花括号只是一个清洁度约定,试图包装复合变量名称user_id吗?或者它是某种特殊的访问者?

任何指向TFM的指针都可以让我感到谦卑.

非常感谢.请温柔.

Jam*_*ore 51

大括号用于显式指定变量名称的结尾.例如:

echo "This square is {$square->width}00 centimeters broad."; 
Run Code Online (Sandbox Code Playgroud)

所以,你的案例实际上是两个特例的组合.您可以使用花括号访问类变量,如下所示:

$class->{'variable_name'} // Same as $class->variable_name
$class->{'variable' . '_name'} // Dynamic values are also allowed
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你只是用大括号语法围绕它们.

请参阅PHP手册 "复杂(卷曲)语法".

  • 这不是使用$ this - > _ session - > {'user_id'}的情况. (2认同)
  • @jimyi,我进一步澄清了我的答案.谢谢.@papayasoft,我同意在你的情况下这是非常不必要的.我的猜测是它是自动生成的代码,它们使用复杂的卷曲语法来覆盖所有基础. (2认同)

Gum*_*mbo 23

我在使用变量变量时就知道了语法:

$userProp = 'id';
$this->_session->{'user_'.$userProp};
Run Code Online (Sandbox Code Playgroud)


Ken*_*ric 19

这可能是该语法的一大优势,但它通常在毛茸茸的东西领域,以及你可能想要避免的东西.

它允许您使用变量名中的字符,否则这些字符是不允许的.

即:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 
Run Code Online (Sandbox Code Playgroud)

  • 但它并不像你的例子那样极端.例如,您可以想象将会话数据存储在数据库中,以及名为"user-id"而不是"user_id"的列... (6认同)
  • 此外,在旧版本的PHP上,将\ 0放在字符串ISTR的前面,您可以访问pivot变量.现在至少\ 0给你一个"你不能做那个抱歉"的致命异常. (2认同)

Don*_*oer 11

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

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
Run Code Online (Sandbox Code Playgroud)


cha*_*aos 11

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

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