我正在閱讀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