如何通过在PHP中使用包含该链的字符串来链接调用函数

时间:2015-05-19 08:03:48

标签: php call method-chaining

我有这样的连锁电话:

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

2 个答案:

答案 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