成员变量的PHP大括号语法

时间:2009-07-18 16:18:42

标签: php syntax variables curly-braces

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

试图找出Zend Framework并遇到以下语法:

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

我从未见过用于访问看似成员变量的花括号语法。它与

有什么不同
$this->_session->user_id

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

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

任何指向TFM的指针都让我感到谦卑。

非常感谢。请温柔。

5 个答案:

答案 0 :(得分: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 manual,“复杂(卷曲)语法。”

答案 1 :(得分:23)

我在使用variable variables时知道语法:

$userProp = 'id';
$this->_session->{'user_'.$userProp};

答案 2 :(得分:19)

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

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

即:

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

答案 3 :(得分:11)

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

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;

答案 4 :(得分:11)

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

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