0

我目前正在构建一个 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不是函数?

谢谢

4

5 回答 5

2

如果你想使用一个常量值作为方法名,你可以使用 curly 表达式语法:

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

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

于 2012-04-27T17:09:30.317 回答
2

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

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

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

更新

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

 $controller->{self::DMVC_DEF_CTRL_FUNCTION}( "Blah" );
于 2012-04-27T17:10:04.940 回答
1

PHP 知道变量保存数据,这就是变量的用途。这就是为什么您可以使用变量变量并通过评估变量来执行您正在尝试执行的函数它如何知道您打算将其用作常量而不仅仅是函数的实际名称?

您可以使用以下内容来执行相同的目的:

if(method_exists($Controller, DMVC_DEF_CTRL_FUNCTION)){
    call_user_func(array($Controller, DMVC_DEF_CTRL_FUNCTION),$SecondRoute);
} else {
    // 404
    die;
}
于 2012-04-27T17:02:33.547 回答
0

对于这一行:

if(method_exists($Controller, DMVC_DEF_CTRL_FUNCTION)){

define('DMVC_DEF_CTRL_FUNCTION', 'some value')以前做过吗?如果不是,您正在检查一个未定义的常量,它实际上会变成

if (method_exists($Controller, NULL)){

method_exists()要求您将方法的名称作为字符串传递。由于您没有引用该DMVC...部分,它作为一个常量进入,这意味着它必须是之前定义的。

编辑:

$x = 'hello';
define('x', 'goodbye');

$obj->x();  // this is NOT going to call hello() **OR** goodbye()
于 2012-04-27T17:03:21.910 回答
0

PHP 不知道您没有调用函数 DMVC_DEF_CTRL_FUNCTION,如

function DMVC_DEF_CTRL_FUNCTION()
{
    // some function
}

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

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

在常量周围添加括号。

于 2012-04-27T17:13:51.157 回答