2012-01-29 65 views
14

我正在阅读OpenCart的源代码,我遇到了下面这样的表达式。可能有人向我解释:PHP中的大括号表示法

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

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

回答

23

大括号来表示在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']的值运行多种功能之一。

+1

谢谢,我发现这个解释非常容易理解和广泛。 – Tarik 2012-01-30 06:03:15

+1

在你的第一个例子中,简单地写'$ object - > $ property_name ='bar''将会产生完全相同的效果。我想大括号只是一个不平凡的表达 – Cruncher 2017-08-05 12:05:17

4
+3

裸链接的答案不是答案。如果您觉得此问题重复另一个问题,请将其标记为关闭。否则,你应该详细说明你引用的链接。 – BoltClock 2012-01-29 19:29:49

+0

我知道字符串中的花括号,但在我的示例中,花括号不会用引号括起来。 – Tarik 2012-01-29 19:31:54

+0

@BoltClock谢谢。 – Kristian 2012-01-29 19:42:40

10

属性的名称是在运行过程中从两个字符串

说来计算,$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" 
+0

为什么没有人说什么?现在的代码根本不工作(缺少函数调用)。现在通过使用变量而不是函数来修复。 – knittl 2013-01-18 19:33:50