【问题标题】:Dynamically Loading Namespaced Classes动态加载命名空间类
【发布时间】:2011-07-23 07:43:36
【问题描述】:

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

到目前为止我有:

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下载。

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

【问题讨论】:

  • 让 error_reporting 工作。这将解决wsod。而且不需要静态类,所以不要这样做$self funkiness...

标签: php dynamic namespaces php-5.3 autoload


【解决方案1】:

你可以看看我几天前提出的问题。答案将帮助您改进加载器类。 Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2014-10-10
    • 2015-07-29
    • 1970-01-01
    • 2015-05-24
    • 2013-03-12
    相关资源
    最近更新 更多