将常量称为函数名称?

时间:2014-03-26 15:23:20

标签: php function constants

(请在告诉我任何新方法之前先阅读整个问题。)

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

4 个答案:

答案 0 :(得分:2)

从PHP 7.0开始有效。唯一的事情是您必须使用更具表现力的语法,以便PHP知道您是要执行myfunc而不是func

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

(func)();

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

PHP的问题在于,常量和标识符在令牌生成器中表示为同一事物。 See online how this syntax is tokenized by PHP

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

答案 1 :(得分:1)

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

答案 2 :(得分: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的函数。

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

答案 3 :(得分:0)

尝试这个。为我工作。

Pillow

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