【问题标题】:PHP curly brace syntax for member variable成员变量的PHP花括号语法
【发布时间】:2023-03-11 11:36:08
【问题描述】:

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

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

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

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

$this->_session->user_id

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

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

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

非常感谢。请温柔一点。

【问题讨论】:

  • 感谢大家的快速和出色的回答。有了这个对 SO 的温和启动,我被鼓励更多地使用它。希望我能帮助回答问题,而不仅仅是问他们。干杯。
  • 有趣的花絮:可以用 curly 语法调用方法,结果和直接调用方法一样快。使用 call_user_func 更通用,但是使用 call_user_func(array($obj,$method),"parm1","parm2") 而不是 $obj->{$method}("parm1,"parm2" 需要两倍的时间);
  • 而且后者也更具可读性。至少国际海事组织。实际上,在这种情况下,我经常省略方法名称上的花括号:$obj->$method($params)

标签: php syntax variables curly-braces


【解决方案1】:

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

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

【讨论】:

  • 这不是使用 $this->_session->{'user_id'} 的情况。
  • 感谢您的快速回复。是的,我会拿头掌。我在其他情况下使用过该语法,只是在成员变量的上下文中没有识别它。更糟糕的是,在我的搜索中,我在手册的那个页面上,但没有看到成员变量示例。叹息......不过,我给出的例子是一种奇怪的使用它的案例,对吧?没有真正的歧义,也不需要真正的描述。当然在语法上是有效的,但有点不必要的用法。明白我的意思了吗?
  • @jimyi,我进一步澄清了我的答案。谢谢。 @papayasoft,我同意在你的情况下这是非常不必要的。我的猜测是它是自动生成的代码,他们使用复杂的 curly 语法只是为了涵盖所有基础。
【解决方案2】:

我只知道使用variable variables时的语法:

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

【讨论】:

  • 正如@jimyi 暗示的那样,+1 是唯一正确链接到 TFM 的答案。 O.P. 不是关于字符串的复杂(卷曲)语法。它是关于使用花括号来解决变量变量中的歧义。
【解决方案3】:

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

object->{'name_of_member'};

object->name_of_member;

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

【讨论】:

    【解决方案4】:

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

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

    即:

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

    【讨论】:

    • 不过,它不必像您的示例那样极端。例如,您可以想象将会话数据存储在数据库中,以及名为“user-id”而不是“user_id”的列...
    • 此外,在旧版本的 PHP 中,将 \0 放在字符串 ISTR 的前面可以让您访问 pivate 变量。现在至少 \0 给你一个“你不能做那个对不起”的致命异常。
    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多