PHP的字符串类调用函数

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

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

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

$player = new Player();

call_user_func($Player, 'SayHi');
user441521 asked 2020-02-17T21:45:09Z
5个解决方案
102 votes

call_user_func语法在PHP中有点奇怪。 您需要做的是创建一个数组。 第一个元素是对象,第二个元素是方法。

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

您也可以在没有call_user_func的情况下执行此操作:

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

要么:

$method = 'SayHi';
$player->$method();
Rocket Hazmat answered 2020-02-17T21:45:31Z
9 votes

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

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

请参阅回调,特别是:

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
meagar answered 2020-02-17T21:45:55Z
2 votes

我在这里给出另一个问题的答案(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}()

现在,将所有变量分散到您的代码中。 您已成为反基督者。

为什么? 因为没有人可以再阅读您的代码。 包括你自己。

更好的方法是在代码中包含对您进行的函数调用的实际引用。 没有隐藏在一些晦涩的字符串中。 不,只是包装到函数中的标准代码调用。

尝试使其尽可能简单。 因此,更好的解决方案是:

$x = function(){
  $player = new Player();
  $player->sayHi();
};


$x();

您的IDE将找到这些引用。 $myz->{$x}()您的IDE找不到,您将无法很好地维护您的代码

Toskan answered 2020-02-17T21:46:43Z
0 votes

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

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

或使用回调

$player = new Player();
call_user_func(array($player, 'SayHi'));
Nagarjun answered 2020-02-17T21:47:07Z
-8 votes

$player->SayHi();

我喜欢这种形式。

zeyorama answered 2020-02-17T21:47:31Z
translate from https://stackoverflow.com:/questions/16740112/php-call-class-function-by-string-name