Вьющиеся фигурные скобки в PHP - PullRequest
16 голосов
/ 29 января 2012

Я читал исходники OpenCart и столкнулся с таким выражением ниже.Может ли кто-нибудь объяснить это мне:

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

В заявлении есть странная часть кода, которая
$this->{'model_shipping_' . $result['code']}
, которая имеет {}, и мне интересно, что это?Мне это кажется объектом, но я не совсем уверен.

Ответы [ 3 ]

27 голосов
/ 29 января 2012

Фигурные скобки используются для обозначения интерполяции строк или переменных в 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'].

10 голосов
/ 29 января 2012

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

Скажем, $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"
4 голосов
/ 29 января 2012

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

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

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

...