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

У меня есть цепной вызов, например, так:

$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()

6

Решение

Давайте начнем с более нейтрального текстового формата, с которым легко работать:

$chain = 'getUser.getName';

А потом просто уменьшить Это:

$result = array_reduce(explode('.', $chain), function ($obj, $method) {
return $obj->$method();
}, $object);

Обратите внимание, что вы могли бы даже осмотреть $obj выяснить, $method это метод или свойство или даже индекс массива и return значение соответственно. Увидеть прут для вдохновения.

13

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

Я пытаюсь создать общий способ фильтрации объектов и массивов. Иногда эта фильтрация требует цепного вызова для сравнения определенных полей с заданным значением.

Я думаю, что вместо изобретения нового решения вы можете использовать уже существующее Компонент PropertyAccess из Symfony.

1

По вопросам рекламы [email protected]