我正在编写一个微型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,它仍然会失败。这也适用于每个函数(需要全局变量)。有人可以帮忙吗?
答案 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()函数,该函数在加载站点时被调用。很好地工作。现在模型/助手/视图和控制器工作得很好。
感谢您的帮助! :)