我有这样的连锁电话:
$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()
答案 0 :(得分:13)
让我们从一个易于处理的更中性的文本格式开始:
if (in_array($action, ['create', 'update']) {
...
}
然后简单地reduce:
$chain = 'getUser.getName';
请注意,您甚至可以检查$result = array_reduce(explode('.', $chain), function ($obj, $method) {
return $obj->$method();
}, $object);
以确定$obj
是方法,属性还是数组索引,并且$method
值是否合适。请参阅Twig获取灵感。
答案 1 :(得分:1)
我正在尝试创建一种过滤对象和数组的通用方法。有时,此过滤需要链调用以将特定字段与给定值进行比较。
我认为不是发明新的解决方案,而是使用现有的解决方案,例如来自Symfony的PropertyAccess Component。