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

wvyml7n5  于 2023-01-08  发布在  PHP
关注(0)|答案(4)|浏览(139)

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

9udxz4iz

9udxz4iz1#

从PHP 7.0开始就可以这样做,但是您必须使用更详细的语法,以便PHP知道您要执行myfunc而不是func

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

(func)();

请在线尝试:https://3v4l.org/fsGmo
PHP的问题是常量和标识符在tokenizer中被表示为相同的东西。See online how this syntax is tokenized by PHP
当你使用括号来改变常量的操作优先级时,你告诉PHP首先解析常量,然后使用它的值来执行函数,否则PHP会认为func是你的函数名。

rdlzhqv9

rdlzhqv92#

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

kxkpmulp

kxkpmulp3#

试试这个,很适合我.

constant('func')();

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

k2arahey

k2arahey4#

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

define('FUNC', 'myFunction');

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

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

将导致PHP解释器需要一个名为FUNC的函数。因此出现错误***致命错误:*调用未定义的函数FUNC()
尽管常量FUNC的类型是callable,但将其作为函数调用是行不通的,因为PHP需要一个名为FUNC的函数。
因此,如果没有解决方案,您将无法直接通过常量调用函数。

相关问题