PHP 中的大括号表示法

2022-08-30 20:44:09

我正在阅读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']


答案 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"

推荐