我有一个关于从字符串运行方法获取价值的问题。虽然我能够从字符串处理单个方法调用,但我很好奇如何从字符串中调用一系列方法。
例如。 $ project是一个Object。
$method1 = "name";
$project->$method1; // It shows the valid results
$method2 = "get()->first()->name";
$project->get()->first()-name; // It shows the valid results
$project->$method2; // get a null result
请帮助找到使 $ method2 工作的方法。如果我在这些方法中有params会发生什么?
这里的原因是我已经制作了一系列自定义方法。它可以逐行运行,但我正在考虑将它们转换为循环的方法,因此它更有效。将方法放入文件中,然后通过循环获取值。
Array = [" getvalue1()"," getvalue2()",...." getValuen() - > anotherMethod() - >值"]
谢谢,
答案 0 :(得分:3)
如果你想嵌套尝试这样的东西:
private function callMethodChain($model, $methodChain)
{
return array_reduce(explode('->', $methodChain), function($model, $method) {
return $model->$method;
}, $model);
}
这将按照您的描述进行一系列方法调用。如果链条(最后一块)的某些属性属性,我想我曾经操纵过以下方法来处理它:
protected function callMethodChain($model, $methodChain)
{
return array_reduce(explode('->', $methodChain), function($model, $method) {
try {
return $model->$method;
} catch (Exception $e) {
return $model->$method();
}
}, $model);
}
如果您想添加参数,请尝试将$model->method
替换为:
call_user_func_array(
array($project, 'your_method'),
$params
);
答案 1 :(得分:0)
尝试这种方法:
$method1 = 'name';
$project->{$method1}();
答案 2 :(得分:0)
从字符串值
运行方法
使用call_user_func()和call_user_func_array()。
call_user_func_array()适合传递参数
call_user_func_array(
array($project, 'your_method'),
$params
);
连锁功能
function chain_fun($chain,$object)
{
return array_reduce(explode('->', $chain), function ($obj, $method) {
if(preg_match('/[()]/',$method)){
$method=trim($method,'()');
return $obj->$method();
}
return $obj->$method;
}, $object);
}
这是测试
akshay@db-3325:/tmp$ cat test.php
<?php
class Testclass
{
private $str;
function __construct()
{
$this->str = new StdClass;
}
function addA()
{
$this->str->a='A';
return $this;
}
function addB()
{
$this->str->b='B';
return $this;
}
function get()
{
return $this->str;
}
}
function chain_fun($chain,$object)
{
return array_reduce(explode('->', $chain), function ($obj, $method) {
if(preg_match('/[()]/',$method)){
$method=trim($method,'()');
return $obj->$method();
}
return $obj->$method;
}, $object);
}
$object = new Testclass();
// Output 1
print_r(chain_fun("addA()->addB()->get()", $object));
// Output 2
echo chain_fun("addA()->addB()->get()->a", $object);
?>
<强>输出强>
akshay@db-3325:/tmp$ php test.php
stdClass Object
(
[a] => A
[b] => B
)
A