如何通过函数名调用一个普通的(非静态的)类函数?
下面的代码会提示一个错误,指出参数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'));
顺便说一下,通常这是反模式:
$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();
如果您的代码中包含$myz->{$x}()
这样的引用,您的IDE将会找到这些引用。但是,如果您的代码中包含$myz->x()
这样的引用,您的IDE将无法找到并且您将无法很好地维护您的代码。
我想为那些具有参数的类函数添加答案:
class Player{
public function Say($what){ print($what); }
}
$player = new Player();
call_user_func_array( [ $player, 'Say' ], [ 'Hi' ] );
class Player{
public function Say($what,$end){ print($what.$end); }
}
$player = new Player();
call_user_func_array( [ $player, 'Say' ], [ 'Hi','gh' ] );
无论如何,您都要创建一个类的对象,因此可以使用该对象调用其函数。
$player = new Player();
$player->SayHi();
或者使用回调函数
$player = new Player();
call_user_func(array($player, 'SayHi'));
$player->SayHi();
我更喜欢这种形式。
$player->$SayHi()
吗? - greenoldman