首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPL自动加载最佳实践

SPL自动加载最佳实践
EN

Stack Overflow用户
提问于 2009-11-11 16:30:22
回答 2查看 3.8K关注 0票数 5

在服务器端的include_path中,我引用了'/usr/share/ pear /‘中的pear目录。在我的应用程序中,我包含了一个公共库中的文件,该库与require_once 'library/file.php'一起位于'/usr/share/pear/ library /‘中。

我最近开始使用spl自动加载器,我注意到在加载器函数中,您必须确定包含文件的逻辑。我做这件事的第一个方法是尝试包含一个文件并使用@隐藏它,看看它是否会失败,例如@include 'library/file.php'。但是我认为主要是因为我读到了很多关于@是一个糟糕的实践的文章,我决定自己手动做这项工作,通过PATH_SEPARATOR分解get_include_path,看看目录是否是我想要的,然后做一个file_exists并包含它。

如下所示:

代码语言:javascript
复制
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业务,或者我做的方向对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-12 03:25:49

Habari project autoloader做了一件有趣的事情,那就是在内存中缓存整个类文件列表,这样它就不会在每次请求类时都对文件进行磁盘搜索。

本质上,您可以在__autoload()中声明一个静态变量,该变量包含所有类文件的数组,这些文件由将导致加载它们的类进行索引。例如,代码将使用Dir或glob()来生成此静态数组:

代码语言:javascript
复制
$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

然后,您只需包含$class_files[$class]即可获得正确的文件。这很好而且很快,因为它一次性从磁盘获取目录,而不是每次引用新类时生成列表或搜索特定的文件名。(你会惊讶于它对速度的影响有多大。)

如果类名不是数组中的键,则可以抛出自定义异常或生成stub/mock类返回。此外,如果您查看Habari系统自动加载器,您将看到Habari在自动加载的类中实现了__static(),这类似于静态类的构造函数。

要避免使用include_once(),如果已经检查了要包含的文件,则不需要使用@操作符。

票数 7
EN

Stack Overflow用户

发布于 2009-11-11 16:42:48

我个人使用的方法是

代码语言:javascript
复制
function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

即使没有@来简化调试(错误在生产中被关闭/记录)

您可能还会对PHP开发人员列表中的相关讨论感兴趣:http://marc.info/?t=125787162200003&r=1&w=2

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1713820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档