从字符串值运行方法链

时间:2017-02-22 18:52:34

标签: php laravel laravel-5

我有一个关于从字符串运行方法获取价值的问题。虽然我能够从字符串处理单个方法调用,但我很好奇如何从字符串中调用一系列方法。

例如。 $ 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() - >值"]

谢谢,

3 个答案:

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