问题描述
|
我正在PHP中寻找与其功能
call_user_func
相当的东西。
我在使用此功能时遇到的问题是它不会进入“对象模式”。通过这个,我的意思是我不能在课堂上使用$this
和其他东西,所以几乎用两个词来表达:不是oop。
我基本上需要这个,因为我正在处理所请求的url,对其进行解析,然后查看一切是否正常等等,然后执行以下几行:
call_user_func(array(ucfirst( $controller . \"Controller\" ),\'_initAction\'),$param);
call_user_func(array(ucfirst( $controller . \"Controller\" ),$action . \'Action\'),$param);
因为我想动态调用ѭ3及其动作。但是我不能在$action
方法中使用$this
,因为它不是OOP。
这是我收到的消息:
Fatal error: Using $this when not in object context in E:\\htdocs\\wit\\application\\controller\\InformationController.php on line 6
所以我希望有人能帮助我。
您能否告诉我我是否以错误的方式解决了这个问题?
PS:请不要向我推荐任何处理此问题的MVC框架。我喜欢Zend,但有时它太重了:((我为此需要一个轻量级的设置。解决方法
您可以通过在回调的第一个元素中传递对象来调用对象方法:
$class = ucfirst($controller . \"Controller\");
$controller = new $class();
call_user_func(array($controller,$action . \'Action\'),$param);
其实你甚至可以使用
$controller = new $class();
$controller->{$action . \'Action\'}();
,看一下Glue如何调用用户定义的函数。因为用户定义了处理路由的类,所以它可能为您指明了正确的方向。
<?php
require_once(\'glue.php\');
$urls = array(
\'/\' => \'index\'
);
class index {
function GET() {
echo \"Hello,World!\";
}
}
glue::stick($urls);
?>
,如果我完全想念您的问题,对不起。在我看来,您正在尝试使用call_user_func
调用对象方法。您可以这样做,只需将对象作为第一个索引传递数组,并将方法的字符串名称作为第二个索引传递数组。
例如,假设您将控制器\“ IndexController \”与\“ index \”作为操作/方法。
class IndexController {
public function index() {
// $this available here
}
}
$controller = new IndexController();
// if you know your parameters all ahead of time
call_user_func(array($controller,\'index\'),$param1,$param2);
// if you want to pass an unknown number of params
call_user_func_array(array($controller,$params);
,$view = View::getInstance( $config[\'view\'] );
$err = new ErrorController(array(),$view);
//load the class and its method
//pass the params to it
$class = ucfirst( $controller . \"Controller\" );
if ( class_exists($class) )
{
$con = new $class($param,$view);
$act = $action . \'Action\';
if ( method_exists($con,$act) )
{
$con->$act();
}
else
{
$view->setController(\"error\");
$view->setAction(\'index\');
$err->indexAction();
}
}
else
{
$view->setController(\"error\");
$view->setAction(\'index\');
$err->indexAction();
}
因此,这就是我的解决方案。它基于@AlexAtNet解决方案和@Sean向我推荐的胶水部分