2011-03-26 121 views
2

我正在研究一个将使用命名空间并完全依赖于PHP5.3的PHP数据映射器框架。为了允许其他人使用框架并根据需要扩展其内部组件,我想支持一种动态自动加载的形式,它将首先从任何自定义名称空间加载所请求的类文件,最后从框架名称空间加载。动态加载命名空间类

到目前为止,我有:

class Gacela { 

protected static $_instance; 

protected $_namespaces = array(); 

protected $_sources = array(); 

protected $_mappers = array(); 

protected $_resources = array(); 

protected function __construct() 
{ 
    spl_autoload_register(array(__CLASS__, 'autoload')); 

    $this->registerNamespace('Gacela', dirname(realpath(__FILE__))); 
} 

protected function _findFile($file) 
{ 
    if(file_exists($file) && is_readable($file)) { 
     return true; 
    } 

    return false; 
} 

public static function autoload($class) 
{ 
    $parts = explode("\\", $class); 
    $self = self::instance(); 
    $return = false; 

    if(isset($self->_namespaces[$parts[0]])) { 
     $file = $self->_namespaces[$parts[0]].str_replace("\\", "/", $class).'.php'; 

     if($self->_findFile($file)) { 
      $return = $class; 
     } 
    } else { 

     $namespaces = array_reverse($self->_namespaces); 

     foreach ($namespaces as $ns => $path) { 
      $file = $path.$ns.str_replace("\\", "/", $class).'.php'; 

      if($self->_findFile($file)) { 
       $return = $ns . $class; 
       break; 
      } 
     } 
    } 

    require $file; 

    return $return; 
} 

public static function instance() 
{ 
    if(is_null(self::$_instance)) { 
     self::$_instance = new Gacela(); 
    } 

    return self::$_instance; 
} 
} 

不幸的是,它只是一个白色画面,每当我尝试加载任何类吧。

如果您想查看完整的框架代码,可以从github下载。

任何人都可以提供有关这方面的见解可以完成?

+0

获取error_reporting工作。这将解决wsod。而且不需要静态类,所以不要这样做'$ self' funkiness ... – ircmaxell 2011-03-26 02:10:28

回答

0

你可以看看我前几天提出的问题。答案将帮助你提高装载机班。 Here