从不同的名称空间调用类


Call class from different namespace

我有两个类,Router和Sammy,两者都在不同的命名空间,但我需要在Router类中调用Sammy类,但它给了我一个错误

Notice: Undefined index: GlobeAPI'Classes'Router'Sammy in /opt/lampp/htdocs/web/globeapi/GlobeAPI/Classes/Autoloader/Autoloader.php on line 151

错误,它的自身是不相关的,现在,我不知道如何正确地调用萨米类。

这里是Router.php代码

 namespace GlobeAPI'Classes'Router;
class Router
{
    public static $call = null;
    function __construct()
    {
    }
    public static function get($route, $call) {
        self::$call = $call;
        Sammy::process($route, 'GET');
    }
    public static function post($route, $call) {
        self::$call = $call;
        Sammy::process($route, 'POST');
    }
    public static function put($route, $call) {
        self::$call = $call;
        Sammy::process($route, 'PUT');
    }
    public static function delete($route, $call) {
        self::$call = $call;
        Sammy::process($route, 'DELETE');
    }
    public static function ajax($route, $call) {
        self::$call = $call;
        Sammy::process($route, 'XMLHttpRequest');
    }
    public static function  dispatch()
    {
        $call           =  explode('#', self::$call);
        $controller     = $call[0];
        $function       = $call[1];
        self::loadController($controller);
        self::loadFunction($controller, $function);
    }
    public static function loadController($controller)
    {
        $path = APP_PATH . 'controllers/' . ucfirst($controller) . '.php';
        if(file_exists($path))
        {
            include_once($path);
        }else
        {
            return false;
        }
    }
    public static function loadFunction($controller, $function)
    {
        $cls = ucfirst($controller);
        if(class_exists($cls))
        {
            $tmp = new $cls();
            if(is_callable(array($tmp, $function)))
            {
                $tmp->$function();
            }else
            {
                echo 0;
            }
        }
    }
}

下面是Sammy.php代码

namespace GlobeAPI'Classes'Sammy;

class Sammy {
    public static $route_found = false;
    public $uri = '';
    public $segments = '';
    public $method = '';
    public $format = '';
    public static function instance() {
        static $instance = null;
        if( $instance === null ) {
            $instance = new Sammy;
        }
        return $instance;
    }
    public static function run() {
        if( !static::$route_found ) {
            echo 'Route not defined!';
        }
        ob_end_flush();
    }
    public static function process($route, $type) {
        $sammy = static::instance();
    // Check for ajax
        if( $type == 'XMLHttpRequest' )
          $sammy->method = isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : 'GET';
        if( static::$route_found || (!preg_match('@^'.$route.'(?:'.('w+))?$@uD', $sammy->uri, $matches) || $sammy->method != $type) ) {
            return false;
        }
    // Get the extension
    $extension = $matches[count($matches)-1];
    $extension_test = substr($sammy->uri, -(strlen($extension)+1), (strlen($extension)+1));
    if( $extension_test == '.' . $extension )
      $sammy->format = $extension;
        static::$route_found = true;
        Router::dispatch();
    }
    public function __construct() {
        ob_start();
        $this->uri = $this->get_uri();
        $this->segments = explode('/', trim($this->uri, '/'));
        $this->method = $this->get_method();
    }
    public function segment($num) {
      $num--;
    // Remove the extension
    $this->segments[$num] = isset($this->segments[$num]) ? rtrim($this->segments[$num], '.' . $this->format) : null;
        return isset($this->segments[$num]) ? $this->segments[$num] : null;
    }
    protected function get_method() {
        return isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
    }
    protected function get_uri($prefix_slash = true) {
        if( isset($_SERVER['PATH_INFO']) ) {
            $uri = $_SERVER['PATH_INFO'];
        }elseif( isset($_SERVER['REQUEST_URI']) ) {
            $uri = $_SERVER['REQUEST_URI'];
            if( strpos($uri, $_SERVER['SCRIPT_NAME']) === 0 ) {
                $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
            }elseif( strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0 ) {
                $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
            }
            // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct
            // URI is found, and also fixes the QUERY_STRING server var and $_GET array.
            if( strncmp($uri, '?/', 2) === 0 ) {
                $uri = substr($uri, 2);
            }
            $parts = preg_split('#'?#i', $uri, 2);
            $uri = $parts[0];
            if( isset($parts[1]) ) {
                $_SERVER['QUERY_STRING'] = $parts[1];
                parse_str($_SERVER['QUERY_STRING'], $_GET);
            }else {
                $_SERVER['QUERY_STRING'] = '';
                $_GET = array();
            }
            $uri = parse_url($uri, PHP_URL_PATH);
        }else {
            // Couldn't determine the URI, so just return false
            return false;
        }
        // Do some final cleaning of the URI and return it
        return ($prefix_slash ? '/' : '').str_replace(array('//', '../'), '/', trim($uri, '/'));
    }
    public function format($name, $callback) {
      $sammy = static::instance();
      if( !empty($sammy->format) && $name == $sammy->format )
        echo $callback($sammy);
      else
        return false;
    }
}
$sammy = Sammy::instance();

由于这两个文件不在同一个命名空间中,因此必须在Router.php的命名空间声明之后加上use 这个词,然后加上完整的类命名空间,从而指定要使用哪个类:

use GlobeAPI'Classes'Sammy'Sammy;

您可以在文档中查看更多的解释