57

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

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

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

$player = new Player();

call_user_func($Player, 'SayHi');
4

6 回答 6

123

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

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

你也可以不这样做call_user_func

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

或者:

$method = 'SayHi';
$player->$method();
于 2013-05-24T17:03:32.893 回答
9

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

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

请参阅回调,特别是:

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
于 2013-05-24T17:02:53.127 回答
2

我在这里回答了一个不同的问题(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();

your IDE will find those references. $myz->{$x}() your IDE will not find and you wont be able to maintain well your code

于 2018-08-29T19:37:04.303 回答
1

I wanted to add an answer for people that have a class function that has arguments as well:

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

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

If you have more arguments in your function Player you can put them in the call_user_func_array's second array:

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

$player = new Player();
call_user_func_array( [ $player, 'Say' ], [ 'Hi','gh' ] );
于 2020-12-21T15:43:07.767 回答
-1

无论如何,您都在创建该类的对象,因此您可以使用 object 来调用其函数。

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

或使用回调

$player = new Player();
call_user_func(array($player, 'SayHi'));
于 2013-05-24T17:03:01.640 回答
-8

$player->SayHi();

我更喜欢这种形式。

于 2013-05-24T17:02:58.063 回答