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


How to call a constant as a function name?

在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不允许通过常量直接调用函数

此功能自PHP 7.0起生效。但是您必须使用更详细的语法,以便PHP知道您想执行myfunc而不是func

<?php
function myfunc(){ echo 'works'; }
define('func', 'myfunc');
(func)();

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

PHP的问题是常量和标识符在标记器中表示为相同的东西。请在线查看PHP如何对该语法进行标记

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

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

试试这个。

constant('func')();

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

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

define('FUNC', 'myFunction');
function myFunction()
{
    echo 'Oh, hello there.';
}
FUNC(); // Fatal error: Call to undefined function FUNC()

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

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

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