如何通过名称调用普通(非静态)类函数?
下面给出了一个错误,说param 1需要是一个有效的回调.我不希望函数是静态的,我希望它是一个普通的函数,到目前为止我看到的所有例子都是静态的.
class Player
{
public function SayHi() { print("Hi"); }
}
$player = new Player();
call_user_func($Player, 'SayHi');
Run Code Online (Sandbox Code Playgroud)
Roc*_*mat 105
callbackPHP中的语法有点奇怪.你需要做的是做一个数组.第一个元素是对象,第二个是方法.
call_user_func(array($player, 'SayHi'));
Run Code Online (Sandbox Code Playgroud)
你也可以不用call_user_func:
$player->{'SayHi'}();
Run Code Online (Sandbox Code Playgroud)
要么:
$method = 'SayHi';
$player->$method();
Run Code Online (Sandbox Code Playgroud)
您需要将对象和方法作为数组一起传递:
call_user_func(array($Player, 'SayHi'));
Run Code Online (Sandbox Code Playgroud)
请参阅回调,具体如下:
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
Run Code Online (Sandbox Code Playgroud)
我在这里给出另一个问题的答案(PHP - 你可以将成员函数分配给变量吗?),因为它被一些 stackoverflow 激进分子标记为重复,我无法回答他的问题!stackoverflow 狂热者的心态需要停止。
顺便说一句,通常这是反模式:
$a = 'Pl';
$b = 'aye';
$c = 'r';
$z = $a . $b . $c;
$myz = new $z();
$d = 'Say';
$e = 'Hi';
$x = $d.$e;
$myz->{$x}()
Run Code Online (Sandbox Code Playgroud)
现在将所有变量分散到您的代码中。你已经成为敌基督了。
为什么?因为没有人可以再阅读你的代码了。包括你自己。
更好的方法是在代码中提供对您进行的函数调用的实际引用。没有隐藏在一些不起眼的字符串中。不,只是对代码的标准调用,包装到函数中。
尽量保持简单。所以更好的解决方案是这样的:
$x = function(){
$player = new Player();
$player->sayHi();
};
$x();
Run Code Online (Sandbox Code Playgroud)
您的 IDE 将找到这些引用。$myz->{$x}()您的 IDE 将无法找到并且您将无法很好地维护您的代码