- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
尽管有一些关于这个问题的讨论,但我想通过某些示例检查什么是最好的方法。
我没有使用现有的解决方案,而是创建了自己的持久层(就像许多人所做的那样)所以我的方法在这里也有问题。
对于 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/
我正在寻找一个在 PHP 中与其功能 call_user_func 相当等效的功能。我遇到的这个函数的问题是它没有进入“对象模式”。我的意思是我不能在类里面使用 $this 和其他东西,所以几乎用两个
我想知道是否可以从命名空间文件中调用函数。 目前,下面的代码会产生错误。我知道可以只传递整个命名空间,但是有没有更自动化的方法只使用 U 的别名? use Helpers\User as U; $t
代码胜于 Eloquent : namespaces.php:
我使用的是 php 5.3 (Windows 7)。 我创建了一个调用另一个带有动态变量的函数的函数 func A call func B. func2($a, $b, $c, ) ... the n
我需要使用 call_user_func 。我将需要使用 5 个参数在单独的类中的单独文件中调用一个函数。我在这里找不到任何示例 http://php.net/manual/en/function.c
我在 Symfony2 上开发,我需要调用一个类的方法,两者都只在运行时已知。 我已经成功使用了variable functions和 call_user_func在项目中,但是这次他们给我出了问题.
有什么区别: $callback = array(&$this, 'method'); $callback[0]->$callback[1]($args); 和 call_user_func(arra
我相信对此有一个非常简单的解释。这有什么区别: function barber($type){ echo "You wanted a $type haircut, no problem\n";
下面的两条语句应该是相同的,但是注释掉的语句不起作用。谁能解释一下吗? $peer = GeneralToolkit::getPeerModel($model); //return call_user
有没有一种方法可以在对象的上下文中执行 PHP5.3 中的闭包? class Test { public $name='John'; function greet(){
下面的代码工作正常。 LibraryTests::TestGetServer(); 获取 LibraryTests 中的函数数组并运行它们: $methods = get_class_methods(
我有一个参数数组,我想通过 call_user_func 传递给一个函数。以下代码当前会给出错误:Missing argument 2 for Closure。如何重写它才能正常工作? $args =
我今天遇到了一个有趣的问题。我们有一个利用 Zend Frameworks 缓存功能的应用程序。对此应用程序的请求通常使用以下行调用工厂方法 $result = call_user_func_arr
当我在 PHP 5.2 中的非静态方法上使用 call_user_func 时,我收到严格警告: Strict Standards: Non-static method User::register(
考虑这个简单的场景: $this->method($arg1, $arg2); 解决方法: call_user_func_array(array($this,'method'), array($arg
forward_static_call 和 call_user_func 有什么区别? 同样的问题适用于 forward_static_call_array 和 call_user_func_arra
考虑以下示例: function myTest(&$var) { $var++; echo "var = {$var}\n"; } $x = 42; call_user_func('m
我正在尝试使用 call_user_func 从同一对象的另一个方法调用方法,例如 class MyClass { public function __construct() {
有没有一种方法可以使用 call_user_func 调用函数并向其传递参数?比如我有 function test($args) { echo "I DID IT!"; } 但是我不能调用这个
如何创建一个具有给定参数数组的类,并将其发送给构造函数?类似的东西: class a { var $args = false; function a() {$this->args =
我是一名优秀的程序员,十分优秀!