PHP call_user_func альтернатива - PullRequest
       11

PHP call_user_func альтернатива

1 голос
/ 19 апреля 2011

Я ищу довольно эквивалентный в PHP его функции call_user_func.Проблема, с которой я сталкиваюсь при использовании этой функции, заключается в том, что она не переходит в «режим объекта».Под этим я подразумеваю, что не могу использовать $this и другие вещи в классе, так что почти в двух словах: не упс.

Мне это нужно в основном, поскольку я имею дело с запрошенным URL-адресом, анализируя его,и посмотреть, все ли в порядке и так далее, и затем выполнить следующие строки:

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

, как я хочу динамически вызывать "Controller" и его действия.Но я не могу использовать $this в методах $action, поскольку это не ООП.

Вот сообщение, которое я получаю:

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

Так что я надеюсь, что кто-нибудь сможет мне помочь.

Не могли бы вы также сказать мне, если я неправильно подхожу к этой проблеме?

PS: Пожалуйста, не рекомендуйте мне какие-либо фреймворки MVC, которые заботятся об этом.Мне нравится Zend, но иногда он слишком тяжелый ((Мне нужна легкая настройка для этого.

Ответы [ 4 ]

10 голосов
/ 19 апреля 2011

Вы можете вызвать метод объекта, передав объект в первый элемент обратного вызова:

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

На самом деле, вы даже можете использовать

$controller = new $class();
$controller->{$action . 'Action'}();
0 голосов
/ 19 апреля 2011
$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

0 голосов
/ 19 апреля 2011

Если я полностью пропущу суть вашего вопроса, извините. Мне кажется, что вы пытаетесь вызвать объектный метод, используя 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);
0 голосов
/ 19 апреля 2011

Посмотрите, как Glue вызывает пользовательские функции.Это может указывать вам правильное направление, поскольку пользователи определяют классы для обработки маршрутов.

<?php
require_once('glue.php');
$urls = array(
    '/' => 'index'
);
class index {
    function GET() {
        echo "Hello, World!";
    }
}
glue::stick($urls);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...