我知道我可以使用变量值来调用这样的特定函数:
$this->{'function_name_' . $result['key']}->getMethod($someVariable);
我在想我是否可以做这样的事情:
$function = !empty($changes) ? 'function1($variable)' : 'function2($variable)';
$result = $this->model_model->{$function};
我想要的是如果变量$changes
不为空我想用不同的参数调用不同的函数。
我知道我可以使用if& else但这看起来更优雅。
甚至可以像这样处理类似的问题吗?
感谢。
答案 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;
}
}
或类似的东西..