У меня есть цепной вызов, например, так:
$object->getUser()->getName();
Я знаю, что могу использовать строку для вызова функции объекта:
$functionName = 'getUser';
$object->$functionName() or call_user_func(array($object, functionName))
Мне было интересно, можно ли сделать то же самое для цепного вызова?
Я пытался сделать:
$functionName = 'getUser()->getName';
$object->functionName();
Но я получаю ошибку
Имя метода должно быть строкой
Я думаю, это потому, что ()
а также ->
не может быть интерпретировано, так как они являются частью строки? Есть ли способ, которым я могу достичь этого без необходимости:
$function1 = getUser;
$function2 = getName;
$object->$function1()->$function2();
Цель состоит в том, чтобы получить массив функций и объединить их в цепочку, чтобы вызвать эту цепочку для данного объекта, например:
$functions = array('getCoordinates', 'getLongitude'); // or any other chain call
$functionNames = implode('()->',$functions);
$object->$functionNames()
Давайте начнем с более нейтрального текстового формата, с которым легко работать:
$chain = 'getUser.getName';
А потом просто уменьшить Это:
$result = array_reduce(explode('.', $chain), function ($obj, $method) {
return $obj->$method();
}, $object);
Обратите внимание, что вы могли бы даже осмотреть $obj
выяснить, $method
это метод или свойство или даже индекс массива и return
значение соответственно. Увидеть прут для вдохновения.
Я пытаюсь создать общий способ фильтрации объектов и массивов. Иногда эта фильтрация требует цепного вызова для сравнения определенных полей с заданным значением.
Я думаю, что вместо изобретения нового решения вы можете использовать уже существующее Компонент PropertyAccess из Symfony.