php Slim framework — передача параметра для закрытия

Я пытаюсь изучить код для Slim Framework. В конструкторе для класса Slim $ c передается в замыкание (например, при сохранении / установке объекта запроса / ответа в контейнере):

 public function __construct(array $userSettings = array())
{
// Setup IoC container
$this->container = new \Slim\Helper\Set();
$this->container['settings'] = array_merge(static::getDefaultSettings(), $userSettings);

// Default request
$this->container->singleton('request', function ($c) {
return new \Slim\Http\Request($c['environment']);
});

// Default response
$this->container->singleton('response', function ($c) {
return new \Slim\Http\Response();
});

Но $ c нигде не определен / не объявлен до этого утверждения, так как это работает? Я начал отслеживать все с самого начала, и я нигде не могу найти $ c, пока он не использовался таким образом.

0

Решение

$ c является параметром функции замыкания. Представьте, что у вас есть функция сама по себе:

function myFunction($c) {
echo $c;
}

В случае замыкания вы можете сохранить анонимную функцию в переменной:

$someFunction = function ($c) {
echo $c;
}
$someFunction("hello world");

Таким образом, вместо непосредственного сохранения замыкания в переменной, приведенный выше код передает анонимную функцию в качестве параметра в $ this-> container-> singleton (). Таким образом, $ c не создается, пока не будет вызвано замыкание. Метод singleton сохраняет это в переменной с именем $ value, поэтому, если эта функция выполняется:

$value(array('environment'=>'test'));

$ c теперь будет содержать массив (‘environment’ => ‘test’)

Slim также довольно редко использует магические методы __get () __set (), поэтому из приведенного вами примера кода в классе Slim можно вызвать:

$request = $this->container->request(array('environment'=>'test'));

Контейнер класса Slim \ Helper \ Set. Поскольку у него нет метода запроса, он вызвал бы метод __get () контейнера. Он будет искать сохраненный метод, сконфигурированный выше, для запроса и передать массив как $ c.

2

Другие решения

Я думаю, что Хартнетт дал идеальный ответ. Чтобы было понятнее для вас, пример.

Когда вы определяете функцию, вы только описываете, как она работает. Вы не устанавливаете какие-либо конкретные значения. Например, когда я пишу:

function sum($a, $b) {
return $a + $b;
}

Я не говорю, что ценности $a а также $b здесь. Я просто описываю, что я делаю с этими переменными, чтобы вычислить результат. Это не до тех пор, пока я вызов эта функция, которую я работаю с фактическими значениями:

sum(3, 4); // returns 7

В вашем вопросе $c переменная похожа на $a а также $b переменная.

Как Хартнетт показал в своем ответе, это работает так:

// Definition time
$someFunction = function ($c) {
echo $c;
}

// Calling time
$someFunction("hello world");

Это не до времени звонка, что $c получает свое значение (в данном примере это значение «привет мир»).

0

$c является ссылкой на сам контейнер — так что любые зависимости будут автоматически разрешены при вызове.

Итак, используя, например, объект запроса:

    // Default request
$this->container->singleton('request', function ($c) {
return new \Slim\Http\Request($c['environment']);
});

Глядя на Request Конструктор вы увидите, что он ожидает экземпляр Environment, который мы только что сказали, контейнер должен быть доступен уже с помощью ключа «среда».

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector