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

+1

В вашем первом примере просто написать '$ object -> $ property_name = 'bar'' будет тот же самый эффект. Я полагаю, что фигурные скобки необходимы только тогда, когда это нетривиальное выражение – Cruncher

4

Кудрявые скобки используются для явного указания конца переменной .

https://stackoverflow.com/a/1147942/680578

http://php.net/manual/en/language.types.string.php#language.types.string.parsing.complex

+3

Ответы на несвязанные ссылки не являются ответами. Если вы чувствуете, что этот вопрос дублирует другой, отметьте его для закрытия. В противном случае вы должны уточнить ссылки, которые вы цитируете. – BoltClock

+0

Я знаю фигурные фигурные скобки в строках, но фигурные скобки не завернуты кавычками в моем примере. – Tarik

+0

@BoltClock спасибо. – Kristian

10

Название объекта вычисляется во время выполнения из двух строк

Скажем, $result['code'] является 'abc', то доступ свойство будет

$this->model_shipping_abc 

Эта также полезно, если у вас есть weird символов в вашей собственности или имени метода.

В противном случае не было бы никакой возможности различать следующее:

class A { 
    public $f = 'f'; 
    public $func = 'uiae'; 
} 

$a = new A(); 
echo $a->f . 'unc'; // "func" 
echo $a->{'f' . 'unc'}; // "uiae" 
+0

Почему никто ничего не говорил? Код в нем не работал (функция invocation отсутствует). Исправлено с помощью vars вместо функций. – knittl