PHP使用var初始化类是正常的但是使用常量它会失败。为什么?

时间:2012-04-27 16:58:13

标签: php oop

我目前正在构建一个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是常数。

有人可以向我解释为什么常数不起作用?我也尝试使用constant功能,但没有成功。

我认为PHP认为它是一种功能。如何告诉PHP常量DMVC_DEF_CTRL_FUNCTION不是函数?

由于

5 个答案:

答案 0 :(得分:2)

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

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

否则标识符只会被解释为方法名称。

答案 1 :(得分:2)

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

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

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

<强>更新

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

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

答案 2 :(得分:1)

PHP知道变量保存数据,这就是变量的目的。这就是为什么你可以通过评估变量来使用变量并执行你想要做的函数的原因。它如何知道你打算将它用作常量而不仅仅是函数的实际名称?

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

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

答案 3 :(得分:0)

对于这一行:

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()

答案 4 :(得分:0)

PHP并不知道您没有像

那样调用函数DMVC_DEF_CTRL_FUNCTION
function DMVC_DEF_CTRL_FUNCTION()
{
    // some function
}

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

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

在常量周围添加括号。