如何通过名称调用普通(非静态)类函数?
下面给出了一个错误,说参数 1 需要是一个有效的回调。我不希望函数是静态的,我希望它是一个普通函数,到目前为止我看到的所有示例都是静态的。
class Player
{
public function SayHi() { print("Hi"); }
}
$player = new Player();
call_user_func($Player, 'SayHi');
如何通过名称调用普通(非静态)类函数?
下面给出了一个错误,说参数 1 需要是一个有效的回调。我不希望函数是静态的,我希望它是一个普通函数,到目前为止我看到的所有示例都是静态的。
class Player
{
public function SayHi() { print("Hi"); }
}
$player = new Player();
call_user_func($Player, 'SayHi');
PHP 中的callback
语法有点奇怪。您需要做的是制作一个数组。第一个元素是对象,第二个是方法。
call_user_func(array($player, 'SayHi'));
你也可以不这样做call_user_func
:
$player->{'SayHi'}();
或者:
$method = 'SayHi';
$player->$method();
您需要将对象和方法作为数组一起传递:
call_user_func(array($Player, 'SayHi'));
请参阅回调,特别是:
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
我在这里回答了一个不同的问题(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
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' ] );
无论如何,您都在创建该类的对象,因此您可以使用 object 来调用其函数。
$player = new Player();
$player->SayHi();
或使用回调
$player = new Player();
call_user_func(array($player, 'SayHi'));
$player->SayHi();
我更喜欢这种形式。