如何将常量作为函数名调用?

7
在PHP中,您可以通过在变量内调用它们的名称来调用函数。
function myfunc(){ echo 'works'; }

$func = 'myfunc';
$func(); // Prints "works"

但是,您不能使用常量来实现这一点。
define('func', 'myfunc');

func(); // Error: function "func" not defined

有一些变通方法,比如这些:

$f = func;
$f(); // Prints "works"

call_user_func(func); // Prints "works"

function call($f){ $f(); }
call(func); // Prints "works"

关于 callable 的 PHP 文档指出:

PHP 函数以字符串形式传递其名称。 任何内置或用户定义的函数均可使用,除了语言结构。

似乎没有提到常量值不可调用。

我也尝试过检查它,当然,

var_dump(is_callable(func));

打印输出结果为bool(true)

现在,为什么会是这样呢?据我所知,所有的解决方法都依赖于将常量值分配给变量,但为什么不能直接调用常量呢?

再次强调,我不需要调用函数的方法,我已经提供了一些。我想知道的是为什么 PHP 不允许通过常量直接调用函数。


1
也许这可以澄清一些事情:http://stackoverflow.com/questions/9925176/php-define-a-constant-function-call - MisterBla
@RichardA 是的,我看了那个问题,但与那个问题相比,我的问题是为什么将func定义为"mysql_error"并调用func()不起作用。 - PurkkaKoodari
1
@Fivell 我知道有其他解决方法,但我想知道为什么PHP会这样做。 - PurkkaKoodari
2
@Fivell eval 是有害的。 - MisterBla
@RichardA 当然可以,我只是找不到快速的方法:D - PurkkaKoodari
显示剩余5条评论
4个回答

4
这在 PHP 7.0 及以上版本中可行。但你需要使用更冗长的语法,以便 PHP 知道你想要执行 myfunc 而不是 func
<?php
function myfunc(){ echo 'works'; }
define('func', 'myfunc');

(func)();

请尝试在线操作:https://3v4l.org/fsGmo

PHP的问题在于常量和标识符在令牌化器中表示为相同的内容。 在线查看PHP如何将此语法令牌化

当您使用括号改变常量操作优先级时,您告诉PHP首先解析常量并使用其值来执行函数。否则,PHP将认为func是您的函数名称。


1

既然您问了为什么/原因,我想唯一的答案(可能不会满足您)是:
因为它还没有在https://wiki.php.net/rfc上被提出、讨论和接受。


是的,所以没有不允许的真正理由;它可以被提出、接受并添加到PHP中?@RichardA实际上找到了一份文件,至少证实变量函数只能与变量一起使用。http://www.php.net/manual/en/functions.variable-functions.php - PurkkaKoodari
我猜从技术上讲这是可能的。当运行时检测到没有这样的函数时,它可以在下一步尝试查找具有该名称的常量并重新开始。也许在http://git.php.net/?p=php-src.git;a=blob;f=Zend/zend_vm_def.h;h=7b377dcf2c87d02998cfcdafff6bf34af765cc8c;hb=HEAD#l2629附近。但这是否是一个好功能是另一个问题。老实说,它带来了什么好处,超过了可能的混淆? - VolkerK

1
请尝试这个。对我有效。
constant('func')();

constant() 函数返回常量的值,对于您的情况是 myfunc,然后应用圆括号 (),您将获得有效的 myfunc() 调用。


0

当尝试将常量作为函数调用时,如下所示:

define('FUNC', 'myFunction');

function myFunction()
{
    echo 'Oh, hello there.';
}

FUNC(); // Fatal error: Call to undefined function FUNC()

这会导致PHP解释器期望一个名为FUNC的函数。因此出现错误致命错误:调用未定义的函数FUNC()

尽管常量FUNC的类型是callable,但将其作为函数调用不起作用。这是因为PHP期望一个名为FUNC的函数。

因此,如果没有解决方法,您将无法通过常量直接调用函数。


是的,这是一些内容,但我在问题中已经大部分讲过了。如果有的话,我仍然在寻找一些关于为什么他们会这样做的解释。 - PurkkaKoodari
你为什么要在这里问用户,而不是直接向PHP开发人员询问呢? - makallio85
@Pietu1998 我认为这没有什么解释。我猜它就是它本身。如果常量可以像那样被调用,那会有点混乱,不是吗? - MisterBla
是的,人们不知道那是一个常量还是一个函数,但还是这样。 - PurkkaKoodari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接