PHP 用 var 初始化类是可以的,但使用常量它会失败.为什么


PHP Initialize class with a var is ok but with a constant it fail. Why?

我目前正在构建一个MVC,遇到了一个小问题(我已经得到了解决方案),但是:

这失败是因为Fatal error: Call to undefined method Controller_Home::DMVC_DEF_CTRL_FUNCTION()..

if(method_exists($Controller, DMVC_DEF_CTRL_FUNCTION)){
    $Controller->DMVC_DEF_CTRL_FUNCTION($SecondRoute);
} else {
    // 404
    die;
}

这项工作:

$MethodName = DMVC_DEF_CTRL_FUNCTION;
if(method_exists($Controller, $MethodName)){
    $Controller->$MethodName($SecondRoute);
} else {
    // 404
    die;
}

DMVC_DEF_CTRL_FUNCTION是一个常数。

有人可以向我解释为什么常量不起作用吗?我也尝试过使用常量函数来取乐,但没有成功。

我认为PHP认为它是一个函数。我怎么能告诉PHP常量DMVC_DEF_CTRL_FUNCTION不是一个函数?

谢谢

如果要使用常量值作为方法名称,可以使用卷曲表达式语法:

 $Controller->{CONSTANT_NAME}($SecondRoute);

否则,标识符将永远只能解释为方法名称。

在当前代码中,解释器认为您正在调用名为 DMVC_DEF_CTRL_FUNCTION 的对象的方法。由于DMVC_DEF_CTRL_FUNCTION是一个常量而不是变量,因此php采用名称而不是它所持有的实际值。

您可以通过以下方式强制 php 取值:

 $controller->{DMVC_DEF_CTRL_FUNCTION}( "Blah" );

更新

使用类常量而不是全局常量时,以下内容也将起作用:

 $controller->{self::DMVC_DEF_CTRL_FUNCTION}( "Blah" );

PHP 知道变量保存数据,这就是变量的目的。 这就是为什么你可以使用变量变量并像你试图做的一样执行一个函数,通过计算变量它怎么知道你打算将其用作常量,而不仅仅是函数的实际名称?

您可以使用以下命令来执行相同的目的:

if(method_exists($Controller, DMVC_DEF_CTRL_FUNCTION)){
    call_user_func(array($Controller, DMVC_DEF_CTRL_FUNCTION),$SecondRoute);
} else {
    // 404
    die;
}

对于此行:

if(method_exists($Controller, DMVC_DEF_CTRL_FUNCTION)){

你以前做过define('DMVC_DEF_CTRL_FUNCTION', 'some value')吗?如果没有,您正在检查一个未定义的常量,该常量实际上将成为

if (method_exists($Controller, NULL)){

method_exists()要求您以 STRING 的形式传入方法的名称。由于您没有引用DMVC...部分,因此它将作为常量进入,这意味着它必须之前已定义。

编辑:

$x = 'hello';
define('x', 'goodbye');
$obj->x();  // this is NOT going to call hello() **OR** goodbye()

PHP 不知道你没有DMVC_DEF_CTRL_FUNCTION像

function DMVC_DEF_CTRL_FUNCTION()
{
    // some function
}

Crashspeeder是对的。您可以使用call_user_func,但为什么不告诉 PHP 在尝试调用函数之前替换常量:

$Controller->{DMVC_DEF_CTRL_FUNCTION}($SecondRoute);

在常量两边添加方括号。