使用变量值作为函数的参考

时间:2014-05-27 12:21:38

标签: php

我知道我可以使用变量值来调用这样的特定函数:

$this->{'function_name_' . $result['key']}->getMethod($someVariable);

我在想我是否可以做这样的事情:

$function = !empty($changes) ? 'function1($variable)' : 'function2($variable)';
$result   = $this->model_model->{$function};

我想要的是如果变量$changes不为空我想用不同的参数调用不同的函数。

我知道我可以使用if& else但这看起来更优雅。

甚至可以像这样处理类似的问题吗?

感谢。

3 个答案:

答案 0 :(得分:1)

$this->model_model->{$function};

这表示要查找名为model_model的{​​{1}}属性。它不会递归地解析$function中的文本以查看它是否看起来像函数调用。这不像复制和粘贴原始源代码那样有效。

您想要的只需完成:

$function

答案 1 :(得分:0)

为什么不使用专门用于此任务的call_user_func函数。

$function = !empty($changes) ? 'function1' : 'function2';
call_user_func(array($this->model_model, $function), $variable);

更新:根据你的评论,如果你需要不同的函数/方法的不同参数,那么你仍然可以使用其他版本的函数call_user_func_array,如使用第二个参数作为变量数组:

$var_array = array($variable1, $variable2, .....); 
$function = !empty($changes) ? 'function1' : 'function2';
call_user_func_array(array($this->model_model, $function), $var_array);

答案 2 :(得分:-1)

正常做法是这样的:

$this->model_model->m($param);

其中$ param是特定类型FType2 / FType2等的对象(作为ValueObject)。 这是在对象之间进行传输的最佳方式

但我们知道PHP不支持重载方法:

class Model
{
    public function m(FType1 $param){}    
    public function m(FType2 $param){}
}

但是,我们可以这样做:

interface IType
{
    //..
}

class FType1 implements IType
{
    public $param1;
    //..
}
class FType2 implements IType
{
    public $param1;
    public $param2;
    public $somethingElse;
    //..
}    

...

public function m(IType $param)
{
    if($param instanceof FType1){
        //...
        return;
    }        
    if($param instanceof FType2){
        //... $param->somethingElse
        return;
    }
}

或类似的东西..