PHP call_user_func替代方案

时间:2011-04-19 01:05:14

标签: php oop fatal-error

我正在寻找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);

因为我想动态调用"Controller"及其动作。但我不能在$this方法中使用$action,因为它不是OOP。

我收到的消息:

Fatal error: Using $this when not in object context in E:\htdocs\wit\application\controller\InformationController.php on line 6

所以我希望有人可以帮助我。

你能否告诉我,我是否以错误的方式接近这个问题?

PS:请不要推荐任何处理这些东西的MVC框架。我喜欢Zend,但有时,它太沉重了:((我需要一个轻量级的设置。

4 个答案:

答案 0 :(得分:10)

您可以通过在回调的第一个元素中传递object来调用object方法:

$class = ucfirst($controller . "Controller");
$controller = new $class();
call_user_func(array($controller,  $action . 'Action'), $param);

实际上,您甚至可以使用

$controller = new $class();
$controller->{$action . 'Action'}();

答案 1 :(得分:0)

看看Glue如何调用用户定义的函数。它可能指向正确的方向,因为用户定义了处理路径的类。

<?php
require_once('glue.php');
$urls = array(
    '/' => 'index'
);
class index {
    function GET() {
        echo "Hello, World!";
    }
}
glue::stick($urls);
?>

答案 2 :(得分:0)

如果我完全忽略了你的问题,我很抱歉。听起来像你正在尝试使用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);

答案 3 :(得分:0)

$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推荐给我的部分胶水