2014-03-26 68 views
4

(请告诉我,任何新的方式来做到这一点之前阅读整个问题。)作为函数名称调用常量?

在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文件说:

A PHP function is passed by its name as a string. Any built-in or user-defined function can be used, except language constructs.

人们似乎一无所知不是可调用的恒定值。

我也试着检查一下吧,当然,

var_dump(is_callable(func)); 

打印bool(true)

现在有没有解释为什么这样呢?就我所见,所有的解决方法都依赖于将常量值赋给变量,为什么不能调用常量?

而且,为了让它更加清晰,我不需要调用函数的方法,我甚至在那里提出了一些方法。我想知道为什么 PHP不允许通过常量直接调用函数。

+1

也许这清除了一些东西:http://stackoverflow.com/questions/9925176/php-define-a-constant-function-call – MisterBla

+0

@RichardA是的,我读了这个问题,但相比那个问题我的问题是为什么不把'func'定义为'“mysql_error”'并调用'func()'工作。 – Pietu1998

+0

我想这就是PHP的工作原理。当你做'func()',PHP期望一个叫做func的函数,尽管func是可调用的。我能够给你的最好的答案是“你不能把一个常量作为一个函数调用,没有解决方法”。 – MisterBla

回答

1

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

+0

是的,所以没有真正的理由不允许这样做;它可以被提议,接受并添加到PHP? @RichardA实际上找到了一个文档,至少证明了变量函数只能用于变量。 http://www.php.net/manual/en/functions.variable-functions.php – Pietu1998

+0

我想这在技术上是可行的。当运行时检测到没有这样的函数时,它可以在下一步中尝试找到具有该名称的常量并重新开始。也许在http://git.php.net/?p=php-src.git;a=blob;f=Zend/zend_vm_def.h;h=7b377dcf2c87d02998cfcdafff6bf34af765cc8c;hb=HEAD#l2629周围,但是否这是一个很好的功能是另一个问题。老实说,它给桌子带来了什么,超过了可能的混乱? – VolkerK

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的函数。

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

+0

是的,这是事情,但我在问题中告诉了大部分。我仍然在寻找一些解释,说明为什么他们会这样做,如果有的话。 – Pietu1998

+0

你为什么从这里的用户那里问这个问题,而不是从PHP开发者本身? – makallio85

+0

@ Pietu1998我认为没有解释。这只是我猜想的。如果常量可以被调用,那会不会是一种混淆? – MisterBla