Я пишу простой класс маршрутизатора, который позволит вам выполнять функцию при обнаружении совпадения маршрута. Итак, когда вы определяете маршруты, вы должны сделать что-то вроде этого:
$message = 'Good morning!';
$router->addRoute('GET', 'welcome', function($message) {
echo $message;
});
Затем в классе маршрутизатора это добавляется в массив, например:
public function addRoute($method, $pattern, $handler) {
$this->routes[$pattern] = ['method' => $method, 'handler' => $handler];
}
Как только совпадение найдено путем сравнения шаблона с запрошенным URL-адресом, у меня есть:
return call_user_func($setting['handler']);
Это дает мне ошибку: Fatal error: Uncaught ArgumentCountError: Too few arguments to function
... поэтому я попытался использовать:
return call_user_func_array($setting['handler'], array($message));
... но это дает мне: Notice: Undefined variable: message
Как передать функцию (включая аргументы, если они существуют) для выполнения в классе маршрутизатора с использованием значений, хранящихся в массиве?






Если вы не хотите передавать $message в качестве аргумента во время звонка, его не должно быть в списке параметров функции. Вы, вероятно, просто смотрите на переменную use из окружающей области:
$message = 'Good morning!';
$router->addRoute('GET', 'welcome', function () use ($message) {
echo $message;
});
Вот и все, что нужно для включения переменной из окружающей области в анонимную функцию. Конечно, могут быть или не быть другие способы решения любой задачи более широкого масштаба, которую вы пытаетесь решить ...
Спасибо, видите ли вы какой-нибудь более эффективный способ добиться этого, или это похоже на способ добиться того, что я пытаюсь сделать?