在父控制器中调用基于变量的函数

时间:2010-11-03 12:36:39

标签: php global-variables parent-child

我正在编写一个微型MVC框架,我希望能够根据给定的URL中的操作运行一个函数。我现在这样做:

function action($id, $function){

${$id}->{$function}();

}

其中$ id是要加载的模型/视图/控制器,而$ function是动作。这显然有效,但不在MainController中。我必须将它放在启动脚本中,因为我希望人们能够从视图内部运行操作,以便他们可以根据他们为函数提供的内容执行不同的操作。

Fatal error: Call to a member function testFunction() on a non-object in /home/cherwell/public_html/scott/develop/simple/system/controllers/MainController.php on line 20

任何人都知道解决方法,以便我可以从MainController中调用子控制器中的函数吗?

干杯!

编辑: 我通过以下方式使行动起作用:

if($action != false){

${$id}->{$action}();

} else {

include("system/views/".$id.".php");
}
总是定义

$ id和$ action,所以它工作正常。我现在唯一的问题是任何函数都必须包含所有的全局变量(它是一个很长的列表):

global $id; 
global ${$id};
global $site;
global $start;
global $action;
global $param;
global $helper;
global $model;

如果他们需要其中任何一个(如果你需要从maincontroller / helper / model调用方法,他们会这样做)......

我不知道为什么变量没有传递给函数。我已经为相应的ID声明了类......

编辑2: 实施例。

function testFunction(){
global $helper;
$helper->test();

$this->render("home");

}

工作,但当我删除     全球$助手; 它失败。即使我在启动时加载了全局变量,构造了child和parent,它仍然会失败。这也适用于每个函数(需要全局变量)。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

您是否尝试使用专用的功能来阻止这种编码?

function action($id, $function, $params = array())
{
    if(!is_object($id))
    {
        $id = new $id; //Or just use globalization or something to bring it in scope.
    }

    call_user_func_array(array($id,$function),$params);
}

答案 1 :(得分:0)

在这种情况下,$ {$ id}为空,因为尚未设置。 您是否尝试执行以下操作?

function action($id, $function){

   $controller = new $id();
   $controller->{$function}();

}

答案 2 :(得分:0)

怎么样:

$app = new myApp();
function action ($action)
{
    global $app;
    if (!method_exists($app,$action)) return;
    $app->$action();
}

答案 3 :(得分:0)

我最终在主控制器中创建一个__init()函数,该函数在加载站点时被调用。很好地工作。现在模型/助手/视图和控制器工作得很好。

感谢您的帮助! :)