gpt4 book ai didi

Php(eval vs call_user_func vs 变量函数...)

转载 作者:可可西里 更新时间:2023-11-01 13:44:04 25 4
gpt4 key购买 nike

尽管有一些关于这个问题的讨论,但我想通过某些示例检查什么是最好的方法。
我没有使用现有的解决方案,而是创建了自己的持久层(就像许多人所做的那样)所以我的方法在这里也有问题。

对于 db 中的每个表,我都有模型类,它具有适当的 getter 和 setter 以及一些强制性方法。我还只创建了一个通用的 DAO 类来处理所有类型的模型对象。
因此,例如,为了保存任何模型对象,我实例化了 genericDAO 类并调用了将模型对象作为属性传递的保存方法。问题是在运行时 genericDAO 类不知道它获取了哪个模型对象以及其中存在哪些方法(getter 和 setter),所以我需要调用强制模型类方法来检索属性列表作为多个字符串数组。
例如,每个属性都有数组(table_column_name、attribute_name、is_string)。

当我调用保存函数时,它看起来像这样:

public function save(&$VO) {  
$paramArray = $VO->getParamArray();//get array of attributes
$paramIdArray = $paramArray[0]; //first attribute is always id
/*create and execute getId() and store value into $void to check if it's save or update*/
eval('$voId = $VO->get'.ucfirst($paramIdArray[1]).'();');
...

目前我正在使用 eval 来执行这些方法,但众所周知,eval 非常慢。
我正在考虑将其更改为 call_user_func 方法
像这样的东西:

$voId = call_user_func(array($VO, 'get'.ucfirst($paramIdArray[1])));

但还有其他解决方案。我也许可以使用这样的东西

$method = 'get'.ucfirst($paramIdArray[1]));
$voId = $VO->$method();
否则

$method = 'get'.ucfirst($paramIdArray[1]));
$voId = $VO->{$method}();

什么是最好的方法?

最佳答案

首先,不需要像您那样传递引用。你应该give this a read尝试了解 PHP 如何处理对象引用。

所以 public function save(&$VO) { 应该变成 public function save($VO) {

其次,没有必要使用eval(事实上,出于速度、可调试性等考虑,最好不要使用)。您不能像动态调用那样堆栈跟踪 eval 调用。

第三,call_user_func 几乎没有用,因为 PHP 支持动态变量函数。而不是 call_user_func(array($obj, $method), $arg1),只需调用 $obj->$foo($arg1)call_user_func_array 函数仍然有用,因为它支持可变长度参数并支持传递引用。

所以,最终,我建议这样做:

$method = 'get' . ucfirst($paramIdArray[1]);
$voId = $VO->$method();

请注意,无需调用 method_exists,因为它可能是可调用的,但由于 __get 魔术方法支持而并不存在...

关于Php(eval vs call_user_func vs 变量函数...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4900229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com