成员变量的PHP大括号语法


79

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

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

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

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

$this->_session->user_id

我假设_session是无关紧要的,但由于可能没有问题,因此将其包含在问题中。

花括号只是一个干净的约定,试图包装复合变量名称user_id吗?还是某种特殊的访问器?

任何对TFM的指点,以便我可以R表示赞赏。

非常感谢。请保持温柔。


7
谢谢大家的迅速和出色的回答。通过对SO的温和启动,我被鼓励更多地使用它。希望我能帮助回答问题,而不仅仅是问他们。干杯。
David Weinraub

1
有趣的花絮:可以使用卷曲语法调用方法,其结果与直接调用该方法一样快。使用call_user_func更为通用,但是执行call_user_func(array($ obj,$ method),“ parm1”,“ parm2”)的时间要比$ obj-> {$ method}(“ parm1,” parm2“ );
Rolf

后者也更具可读性。至少是IMO。实际上,在这种情况下,我经常忽略方法名称上的花括号:$obj->$method($params)
David Weinraub 2014年

Answers:


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

感谢您的快速回复。是的,我带头巾。我在其他情况下使用了该语法,只是在成员变量的上下文中无法识别它。更糟糕的是,在搜索中,我位于手册的该页面上,但没有看到成员变量样本。igh……不过,我举的例子有点奇怪,可以使用它,对吗?没有真正的歧义,没有真正的描述。在语法上肯定有效,但是有点不必要的用法。明白了吗?
David Weinraub 09年

2
@jimyi,我进一步澄清了答案。谢谢。@papayasoft,我同意您的情况完全没有必要。我的猜测是它是自动生成的代码,它们使用复杂的卷曲语法只是为了覆盖所有基础。
James Skidmore

24

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

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

1
如@jimyi所暗示的,+ 1是唯一具有正确链接到TFM的答案。OP与字符串的复杂(弯曲)语法无关。这是关于使用花括号来解决变量变量中的歧义。
鲍勃·斯坦

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上,在字符串ISTR的前面加上\ 0可以访问变量变量。现在,至少\ 0会给您一个“您不能做对不起”的致命异常。
肯特·弗雷德里克

12

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

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


11

您问题中的两个示例具有相同的作用。PHP使您可以通过多种方式访问​​成员数据/方法。

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.