I have a chain call like so:
$object->getUser()->getName();
I know that I can use a string to call a function on an object:
$functionName = 'getUser';
$object->$functionName() or call_user_func(array($object, functionName))
I was wondering if it was possible to do the same for a chain call? I tried to do:
$functionName = 'getUser()->getName';
$object->functionName();
But I get an error
Method name must be a string
I guess this is because the ()
and ->
cannot be interpreted since they are part of a string? Is there any way I can achieve this without having to do:
$function1 = getUser;
$function2 = getName;
$object->$function1()->$function2();
The aim is to get an array of functions and to chain them, in order to call this chain on the given object, e.g.:
$functions = array('getCoordinates', 'getLongitude'); // or any other chain call
$functionNames = implode('()->',$functions);
$object->$functionNames()
Let's start with a more neutral text format that's easy to handle:
$chain = 'getUser.getName';
And then simply reduce it:
$result = array_reduce(explode('.', $chain), function ($obj, $method) {
return $obj->$method();
}, $object);
Note that you could even inspect the $obj
to figure out whether $method
is a method or a property or even an array index and return
the value appropriately. See Twig for inspiration.
I am trying to create a generic way of filtering objects in and array. Sometimes this filtering requires a chain call to compare specific fields with a given value.
I think that instead of inventing new solution you can use existing one like PropertyAccess Component from Symfony.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With