从不同的命名空间调用类

时间:2013-05-12 16:49:00

标签: php namespaces

我有两个类,路由器和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();

1 个答案:

答案 0 :(得分:1)

由于这两个文件不在同一名称空间中,因此必须在名称空间声明后添加单词use 后跟完整的类名称空间来指定要使用的类在你的Router.php上:

use GlobeAPI\Classes\Sammy\Sammy;

您可以在documentation上查看更多解释。

相关问题