PHP中的花括号表示法

Posted

技术标签:

【中文标题】PHP中的花括号表示法【英文标题】:Curly Braces Notation in PHP 【发布时间】:2012-02-21 18:48:35 【问题描述】:

我正在阅读 OpenCart 的源代码,我在下面遇到了这样的表达。谁能给我解释一下:

$quote = $this->'model_shipping_' . $result['code']->getQuote($shipping_address);

在语句中,有一个奇怪的代码部分是$this->'model_shipping_' . $result['code'] 其中有,我想知道那是什么?在我看来它是一个对象,但我不太确定。

【问题讨论】:

【参考方案1】:

花括号用于表示 php 中的字符串或变量插值。它允许您创建“变量函数”,这可以让您在不明确知道它实际上是什么的情况下调用函数。

使用它,您可以像创建数组一样在对象上创建属性:

$property_name = 'foo';
$object->$property_name = 'bar';
// same as $object->foo = 'bar';

如果您有某种 REST API 类,您也可以调用一组方法中的一个:

$allowed_methods = ('get', 'post', 'put', 'delete');
$method = strtolower($_SERVER['REQUEST_METHOD']); // eg, 'POST'

if (in_array($method, $allowed_methods)) 
    return $this->$method();
    // return $this->post();

如果您愿意,它也可用于字符串中以更轻松地识别插值:

$hello = 'Hello';
$result = "$hello world";

当然,这些都是简化。您的示例代码的目的是根据$result['code'] 的值运行多个函数之一。

【讨论】:

谢谢,我发现这个解释非常通俗易懂。 在您的第一个示例中,简单地编写$object->$property_name = 'bar' 将具有完全相同的效果。我想当它是一个非平凡的表达式时,大括号是必需的【参考方案2】:

属性的名称是在运行时从两个字符串中计算出来的

假设$result['code']'abc',访问的属性将是

$this->model_shipping_abc

如果您的属性或方法名称中有 奇怪 字符,这也很有帮助。

否则将无法区分以下内容:

class A 
  public $f = 'f';
  public $func = 'uiae';


$a = new A();
echo $a->f . 'unc'; // "func"
echo $a->'f' . 'unc'; // "uiae"

【讨论】:

为什么没人说话?原样的代码根本不起作用(缺少函数调用)。现在通过使用 vars 而不是函数来修复。【参考方案3】:

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

https://***.com/a/1147942/680578

http://php.net/manual/en/language.types.string.php#language.types.string.parsing.complex

【讨论】:

裸链接答案不是答案。如果您觉得这个问题与另一个问题重复,请将其标记为关闭。否则,您应该详细说明您引用的链接。 我知道字符串中的大括号,但在我的示例中大括号没有用引号括起来。

以上是关于PHP中的花括号表示法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kotlin 的 RxJava 中的花括号和普通括号有啥区别

Java中的花括号本身是啥意思?

函数的 JavaScript 参数中的花括号

Scala方法调用中的花括号[重复]

XAML 中的花括号实际上是啥意思?

栈练习之Example005-检查一个程序中的花括号方括号和圆括号是否配对