在我的在服务器侧的include_path我不得不梨目录的引用,在“的/ usr /共享/梨/”。在我的应用我包括来自一个共同的库文件,生活在“在/ usr /共享/梨/库/”与require_once 'library/file.php'

我已经使用SPL自动加载最近开始,我注意到,你必须确定与包含该文件的逻辑装载机功能。我这样做的第一种方式是试图包括文件,并@抑制它,看它是否会失败,例如@include 'library/file.php'但是我觉得主要是因为我读了很多关于@是一个不好的做法,我决定由get_include_path爆炸PATH_SEPARATOR,看到手工做的工作自己,如果该目录是什么,我希望它是,然后做一个file_exists和包括它

像这样:

function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
        $exists = false;
        foreach ( $paths as $path ) 
        {
            $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
            if ( file_exists ( $tmp ) ) 
            {
            $exists = true;
            $file = $tmp;
            }
        }
        if ( !$exists ) { return false; }
    }
    include $file;
}

spl_autoload_register('classLoader');

我是不是走错路线?如果我刚才做了@include业务还是我在正确的方向上稍微做什么呢?

有帮助吗?

解决方案

有一件事情是, Habari的项目自动加载这是否有趣的是在内存中缓存整个类文件列表中,这样,它不是每次都做磁盘搜索文件请求的类。

从本质上讲,你宣布你__autoload()保存所有的类文件的数组,由类索引中的静态,这将导致他们加载。例如,代码将使用风向或glob()生成这个静态数组:

$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

然后只需简单$class_files[$class]以获得正确的文件。这是很好的,快捷的,因为它从磁盘目录中一次全部,而不是生成列表或搜索特定文件名各一个新的类被引用时。 (你会惊讶多少的速度差它使。)

如果类名是不是数组中的一个关键,可以抛出一个自定义异常或生成存根/模拟类返回。另外,如果检查出Habari的系统自动加载,你会看到Habari的实现类中__static()被自动加载,这是像静态类的构造函数。

include_once()是要避免的,如果你已经检查该文件以包括@操作是不必要的。

其他提示

我亲自去使用方式

function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

即使没有@以便调试(错误被关闭/登录生产)

您可能也有兴趣在PHP的开发者名单上的相关讨论: HTTP:/ /marc.info/?t=125787162200003&r=1&w=2

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top