2012-01-29 105 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