PHP: сохранение функций обратного вызова с аргументами в массиве

Я пишу простой класс маршрутизатора, который позволит вам выполнять функцию при обнаружении совпадения маршрута. Итак, когда вы определяете маршруты, вы должны сделать что-то вроде этого:

$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

Как передать функцию (включая аргументы, если они существуют) для выполнения в классе маршрутизатора с использованием значений, хранящихся в массиве?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы не хотите передавать $message в качестве аргумента во время звонка, его не должно быть в списке параметров функции. Вы, вероятно, просто смотрите на переменную use из окружающей области:

$message = 'Good morning!';

$router->addRoute('GET', 'welcome', function () use ($message) {
    echo $message;
});

Спасибо, видите ли вы какой-нибудь более эффективный способ добиться этого, или это похоже на способ добиться того, что я пытаюсь сделать?

MultiDev 09.03.2018 14:31

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

deceze 09.03.2018 14:32

Другие вопросы по теме