2

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

因为我想动态调用 the"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

4 回答 4

10

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

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

实际上,您甚至可以使用

$controller = new $class();
$controller->{$action . 'Action'}();
于 2011-04-19T01:11:20.340 回答
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 向我推荐的部分胶水

于 2011-04-19T12:52:18.563 回答
0

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

<?php
require_once('glue.php');
$urls = array(
    '/' => 'index'
);
class index {
    function GET() {
        echo "Hello, World!";
    }
}
glue::stick($urls);
?>
于 2011-04-19T01:11:04.240 回答
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);
于 2011-04-19T01:12:38.060 回答