php通过字符串名称调用类函数

时间:2013-05-24 17:01:14

标签: php

如何通过名称调用普通(非静态)类函数?

下面给出了一个错误,说param 1需要是一个有效的回调。我不希望函数是静态的,我希望它是一个普通的函数,到目前为止我看到的所有例子都是静态的。

class Player
{
    public function SayHi() { print("Hi"); }
}

$player = new Player();

call_user_func($Player, 'SayHi');

6 个答案:

答案 0 :(得分:97)

callback语法在PHP中有点奇怪。你需要做的是做一个数组。第一个元素是对象,第二个是方法。

call_user_func(array($player, 'SayHi'));

您也可以在没有call_user_func的情况下执行此操作:

$player->{'SayHi'}();

或者:

$method = 'SayHi';
$player->$method();

答案 1 :(得分:9)

您需要将对象和方法作为数组一起传递:

call_user_func(array($Player, 'SayHi'));

请参阅callbacks,具体来说:

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

答案 2 :(得分:1)

我在这里给出另一个问题的答案(PHP - Can you assign a member function to a variable?,因为某些stackoverflow部首将其标记为重复,并且我无法给出他的问题的答案!需要停止Stackoverflow狂热者的心态。

顺便说一句,这通常是反模式:

$a = 'Pl';
$b = 'aye';
$c = 'r';

$z = $a . $b . $c;

$myz = new $z();


$d = 'Say';
$e = 'Hi';

$x = $d.$e;
$myz->{$x}()

现在将所有变量分散到整个代码中。您已成为反基督者。

为什么?因为没有人可以再阅读您的代码。包括你自己。

更好的做法是在代码中实际引用您所进行的函数调用。没有隐藏在一些晦涩的字符串中。不,只是包装到函数中的标准代码调用。

请尝试使其尽可能简单。因此,更好的解决方案是:

$x = function(){
  $player = new Player();
  $player->sayHi();
};


$x();

您的IDE将找到那些引用。 $myz->{$x}()找不到您的IDE,您将无法很好地维护您的代码

答案 3 :(得分:0)

无论如何,你创建了一个类的对象,所以你可以使用object来调用它的函数。

$player = new Player();
$player->SayHi();

或使用回调

$player = new Player();
call_user_func(array($player, 'SayHi'));

答案 4 :(得分:0)

我想为拥有类函数也有参数的人添加一个答案:

class Player{
    public function Say($what){ print($what); }
}

$player = new Player();
call_user_func_array( [ $player, 'Say' ], [ 'Hi' ] );

如果您的函数 Player 中有更多参数,您可以将它们放在 call_user_func_array 的第二个数组中:

class Player{
    public function Say($what,$end){ print($what.$end); }
}

$player = new Player();
call_user_func_array( [ $player, 'Say' ], [ 'Hi','gh' ] );

答案 5 :(得分:-8)

$player->SayHi();

我更喜欢这种形式。