5

我可以在 PHP 中执行以下操作吗?

$lstrClassName  = 'Class';
$lstrMethodName = 'function';
$laParameters   = array('foo' => 1, 'bar' => 2);

$this->$lstrClassName->$lstrMethodName($laParameters);

我现在使用的解决方案是使用 eval() 调用函数,如下所示:

eval('$this->'.$lstrClassName.'->'.$lstrMethodName.'($laParameters);');

我很好奇是否有更好的方法来解决这个问题。

谢谢!

4

4 回答 4

9

您不需要 eval 来执行此操作...取决于您的版本

例子

class Test {
    function hello() {
        echo "Hello ";
    }

    function world() {
        return new Foo ();
    }
}

class Foo {

    function world() {
        echo " world" ;
        return new Bar() ;
    }

    function baba() {

    }
}

class Bar {

    function world($name) {
        echo $name;
    }


}


$class = "Test";
$hello = "hello";
$world = "world";
$object = new $class ();
$object->$hello ();
$object->$world ()->$world ();
$object->$world ()->$world ()->$world(" baba ");

输出

Hello World baba

如果您使用的是 PHP 5.4,您可以直接调用它而无需声明变量

您可能还想查看call_user_func http://php.net/manual/en/function.call-user-func.php

于 2012-04-05T14:23:46.163 回答
4

你试过你的代码吗?确定某事是否可行的最佳方法是尝试它。如果你尝试过,你会发现是的,它确实有效(假设$this有一个名为的属性Class,它是一个定义了名为 的方法的对象的实例function)。

还有两个功能call_user_func()call_user_func_array()

于 2012-04-05T14:21:23.660 回答
1

我建议你call_user_func_array可以用于函数和数组而不是 eval。但是语法与您建议的不同,而且我倾向于尽可能避免使用 eval ,您可以将其用于:

要使用对象调用它,只需执行以下操作:

$return=call_user_func_array(array($objInstance, "CLASSMETHOD"), $paramArray);

于 2012-04-05T14:24:40.577 回答
0

未经测试但

this->$$lstrClassName->$$lstrMethodName($laParameters); 

http://php.net/manual/en/language.variables.variable.php

于 2012-04-05T14:21:05.950 回答