【问题标题】:Curly Braces Notation in PHPPHP中的花括号表示法
【发布时间】:2023-07-22 18:27:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: php curly-braces


    【解决方案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】:

    【讨论】:

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