我正在阅读OpenCart的源代码,我遇到了下面这样的表达式。可能有人向我解释:PHP中的大括号表示法
$quote = $this->{'model_shipping_' . $result['code']}->getQuote($shipping_address);
在声明中,有一个奇怪的代码部分是
$this->{'model_shipping_' . $result['code']}
具有{}
,我不知道那是什么?它看起来是一个对象,但我不确定。
我正在阅读OpenCart的源代码,我遇到了下面这样的表达式。可能有人向我解释:PHP中的大括号表示法
$quote = $this->{'model_shipping_' . $result['code']}->getQuote($shipping_address);
在声明中,有一个奇怪的代码部分是
$this->{'model_shipping_' . $result['code']}
具有{}
,我不知道那是什么?它看起来是一个对象,但我不确定。
大括号来表示在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']
的值运行多种功能之一。
属性的名称是在运行过程中从两个字符串
说来计算,$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"
为什么没有人说什么?现在的代码根本不工作(缺少函数调用)。现在通过使用变量而不是函数来修复。 – knittl 2013-01-18 19:33:50
谢谢,我发现这个解释非常容易理解和广泛。 – Tarik 2012-01-30 06:03:15
在你的第一个例子中,简单地写'$ object - > $ property_name ='bar''将会产生完全相同的效果。我想大括号只是一个不平凡的表达 – Cruncher 2017-08-05 12:05:17