php通过字符串名称调用类函数

use*_*521 50 php

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

下面给出了一个错误,说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)

  • @Zack我知道这可能有点晚了,但对于未来的人来说,这被称为“变量函数”[手册](https://www.php.net/manual/en/functions.variable-functions.php)并且对于变量称为“变量变量”[手册](https://www.php.net/manual/en/language.variables.variable.php) (3认同)

mea*_*gar 9

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

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)


Tos*_*kan 5

我在这里给出另一个问题的答案(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 将无法找到并且您将无法很好地维护您的代码