Задать вопрос
@dimentimor

Как задать область видимости для анонимной функции?

Здравствуйте!

Пример кода:
// переменная, которая потом понадобится
$page = new Pager('page.tpl', ['text' => 'Hello World']);

// тут удобно использовать анонимную функцию
// но приходится передавать в нее все нужные переменные через use
$router->on("/catalog.(.+?)$/", function ($match, $opts) use (&$page ) {
	$page->assign(['title' => 'catalog | '.$match]);
	echo $page->render();
});

Ведь вызывает её метод $router->on(), который в другом файле.
Наверное, на php это делается как-то по другому.. Потому у меня и возникают подобные проблемы.

Можно ли как-то по другому передать переменные в анонимную функцию?
Или я что-то не то делаю?
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
SPAHI4
@SPAHI4
реактовцы - это не девы, а прокидыватели пропсов
именно так, через use.

для больших систем можно использовать готовый продвинутый DI, будет выглядеть примерно так
$router->on("/catalog.(.+?)$/", function (Match $match, Options $opts, Pager $page) {
 // ...
});


или попроще, через service locator, можно написать самому
$app->set('pager', new Pager(...));

$router->on("/catalog.(.+?)$/", function (match, opts) use ($app) {
 // ...
  $app->get('pager')->render(...);
});


и немного разберу исходный код
$router->on("/catalog.(.+?)$/", function ($match, $opts) use (&$page ) { // нет смысла передавать по ссылке &
  // базовый title, в данном случае "catalog", лучше задать где-то на уровень выше, или, по крайней мере, не хардкодить разделитель |
  $page->assign(['title' => 'catalog | '.$match]);
   // вызывать echo прямо тут - плохой вариант, лучше добавить уровень абстракции, и выводить в браузер результат return или как-то еще
  echo $page->render()
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы