PHP call_user_func替代项

| 我正在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, \'index\'), $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向我推荐的胶水部分

要回复问题请先登录注册