我可以用变量调用方法吗?

5
我可以用PHP实现以下功能吗?
$lstrClassName  = 'Class';
$lstrMethodName = 'function';
$laParameters   = array('foo' => 1, 'bar' => 2);

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

我现在使用的解决方案是通过eval()调用函数,代码如下:

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

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

谢谢!


3
当你不得不使用这种方法时,通常意味着你在做某些事情上出了问题。你想要达到什么目的? - NullUserException
1
你真的应该尝试将你的对象重新组织成具有相同方法名称的不同类,而不是在同一类上调用不同的方法。然后你可以传递对象,而不是方法名称。 - rjmunro
做得好,认识到 eval() 不是一个好的选择。你几乎肯定不应该使用字符串 eval(),除非你确切地知道为什么要使用它,并且已经排除了所有更好的替代方案。但是有太多更好的替代方案……所以你可能不应该使用字符串 eval() - dreftymac
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_funchttp://php.net/manual/en/function.call-user-func.php

我为你更新了示例,包括一个参数和3个级别。 - Baba

4
你是否尝试过你的代码?最好的方法是通过尝试来发现它是否可行。如果你真的尝试了,你会发现它确实可行(假设$this有一个名为Class的属性,它是一个定义了一个名为function的方法的对象实例)。
还有两个函数call_user_func()call_user_func_array()

1
我建议您使用call_user_func_array,它可用于函数和数组,而不是eval。 然而,语法与您建议的不同,而且我尽可能避免使用eval,但您可以这样使用它:
要使用对象调用它,只需像这样做: $return=call_user_func_array(array($objInstance, "CLASSMETHOD"), $paramArray);

0

哦,美元符号太多了.. 很明显如果你有 $a="b" 和 $b="hello"; print $$a 将给你输出 "hello" ... - BugFinder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接