如何通过名称调用普通(非静态)类函数?
下面给出了一个错误,说param 1需要是一个有效的回调。我不希望函数是静态的,我希望它是一个普通的函数,到目前为止我看到的所有例子都是静态的。
class Player
{
public function SayHi() { print("Hi"); }
}
$player = new Player();
call_user_func($Player, 'SayHi');
答案 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();
我更喜欢这种形式。