在PHP中自动加载类 - 这是一个好习惯吗?

时间:2011-02-01 13:12:38

标签: php autoload

有一些遗留的PHP代码我已经定义了这样的函数(以及

function __autoload($class_name) 
{
    $filename=CLASSES. strtolower($class_name) . '_class.php';
    if (file_exists($filename))
    {
        require_once $filename;
    }
}

其中CLASSES是这些特定(classname)_class.php文件所在的路径。

上述功能位于随处可见的文件中。

这是否是可以接受的做法 - 任何陷入这样的问题?

4 个答案:

答案 0 :(得分:2)

我认为这是一个偏好问题。我使用不太通用的自动加载功能来减少包含错误文件的几率。它肯定会削减包括维护。

答案 1 :(得分:1)

如果未知类定义,则自动加载功能会加载文件。因此,正如@ fran-Verona和@Andy-Paton所害怕的那样,你不必担心自动加载你所有的课程。

您正在所有代码中加载该函数,但只有在调用它时才会加载“verylittleusedclass.class.php”(例如,通过new VeryLittleUsedClass()或通过静态调用VeryLittleUsedClass::theFunction())。< / p>

我说这是好习惯。如果不知道是否仍然使用它们,则不需要包含所有文件,如果需要,将加载类。

您需要确保正确命名文件。

答案 2 :(得分:1)

我建议使用此自动加载器https://gist.github.com/169617(也称为PEAR样式自动加载器)

适用于此惯例

类名:Core_DB_Mysql 文件路径:Core / DB / Mysql

您可以将您的课程分组;

Core/Cache
     Core/Cache/APC
     Core/Cache/Memcache

Core/Models
     Core/Models/User
     Core/Models/Post

好了这个约定你不需要一次又一次地扫描文件夹

答案 3 :(得分:1)

经验法则是手动包含您确定将使用的所有类,并保留可用于自动加载器的类。

例如,您可能有一个数据库库类,某种类型的设置类,国际化类,注册表类,接口定义类,某种类型的自定义异常类,模板引擎类,以及导致实际的控制器类使用。

因此,您应该将所有这些手动包含在非常接近您的顶部 index.php(或浏览器首次启动的任何文件)使用 包括$ file1.php 包括$ file2.php 等等....

这将为您提供最佳性能,并且这些类保证由APC缓存(如果您使用原因的APC缓存)

现在你的课程中你可能有一些逻辑,有条件地使用一个或另一个类,视情况而定

例如

如果(请求:: isAjax()){ AjaxResponder :: sendResponse(); } else { 返回$ page; }

现在可以让autoloader加载AjaxResponder类,因为它甚至可能不需要。

因此,如果可能不需要某个类,请让自动加载器处理它,否则手动包含。

这是非常简单的规则。

此外,在自动加载器功能中使用智能逻辑非常重要。确保 你有尽可能少的条件测试,也从不使用任何类型的目录扫描来查找类文件。

如果您使用spl_autoload_register,请记住要注意注册的自动加载功能的顺序。订单如果重要的话。

智能自动加载器类的一个很好的例子就在这里

http://groups.google.com/group/php-standards/web/psr-0-final-proposal

注意,它不使用任何检查来查看(file_exists())或类似的东西。 它只使用了 require()并依赖require函数在文件未找到时引发错误。

切勿在自动加载器中使用include_once()或require_once。 这是没有意义的,因为自动加载器不会在类中被调用已经包含但是require_once和include_once仍然需要执行额外的检查以查看文件是否已经包含在内。