PHP:使用命名空间调用另一个类函数?

时间:2017-10-29 12:03:17

标签: php

我在从字符串调用函数时遇到一些问题,因为它比调用函数要复杂得多,我需要在另一个类中使用另一个名称空间执行它。

我使用这种方法调度我的路线,我在GitHub上使用TreeRoute包。

public function dispatch() {
    $uri = substr($_SERVER['REQUEST_URI'], strlen(implode('/', array_slice(explode('/', $_SERVER['SCRIPT_NAME']), 0, -1)) . '/'));
    $method = $_SERVER['REQUEST_METHOD'];

    $result = $this->router->dispatch($method, $uri);

    if (!isset($result['error'])) {
        $handler = $result['handler'];
        $params = $result['params'];

        // TODO: Call the handler here, but how?
    } 
    else {
        switch ($result['error']['code']) {
            case 404 :
                echo 'Not found handler here';
                break;
            case 405 :
                echo 'Method not allowed handler here';
                $allowedMethods = $result['allowed'];
                if ($method == 'OPTIONS') {
                    // OPTIONS method handler here
                }
                break;
        }
    }
}

我注册这样的路线:

public function __construct() {
    $this->router = new \TreeRoute\Router();
}

public function setRoutes() {
    $this->router->addRoute('GET', '/test', 'App/Controllers/SomeController/test');
}

我想要做的是在'SomeController'类中调用函数'test',现在'SomeController有一个名为'App \ Controllers'的命名空间。

我查看了calluserfunc,但我无法弄清楚如何使用我的字符串格式和命名空间,有人可以帮助我吗?

http://php.net/manual/en/function.call-user-func.php

2 个答案:

答案 0 :(得分:0)

您可以使用如下所示的完整类路径调用call_user_func

call_user_func('App\Controllers\SomeController::test', $arg1, $arg2)
// or
call_user_func(['App\Controllers\SomeController', 'test'], $arg1, $arg2)
// or better
use App\Controllers\SomeController;
call_user_func([SomeController::class, 'test'], $arg1, $args2);

答案 1 :(得分:0)

我相信这会完成这项工作

if (!isset($result['error'])) {
    $handler = $result['handler'];
    $params = $result['params'];

    $method = substr( strrchr($handler, '/'), 1 ); // get the method's name from $handler string
    $class = substr($handler, 0, -strlen($method)-1); // get the class name from $handler string
    $class = str_replace('/', '\\', $class); // change slashes for anti-slashes

    // then choose one of those :

        // if your methods are static :
        call_user_func_array([$class, $method], $params);

        // otherwise :
        (new $class)->{$method}(...$params); // needs php 7
}