自动加载机似乎是无所不知的 |嵌套包含不需要


Autoloader appears to be omniscient | Nested includes not needed

我使用这个简单的自动加载器代码:

function __autoload( $class_name ) { include 'class.' . $class_name . '.php'; }

我打这个电话new SDB();

SDB实际上继承了我从未包括SDBOne......然而,自动加载器会加载它。

这意味着它知道加载嵌套/包含在其他模块中的模块。

因此,从外观上看,如果我使用自动加载器,我永远不需要要求或包含任何东西。

但是,如果我使用没有自动加载器的独立模块,则需要包含它继承的类。

我应该使用

require,
require_once,
include,
include_once.

我想和require_once一起去,因为我想要一个错误而不是警告......另外,当我将代码与自动加载器一起使用时,我不希望它加载两次。

基本上我对 SDB 有两种用途:一种是自动加载机存在,另一种是没有输出。

参考

http://php.net/manual/en/language.oop5.autoload.php

你是对的,require_once 将父类或依赖类包含在一个文件中的正确方法。 这样,如果多次包含它,require_once可以防止重新声明类时出现的错误。

自动加载器会自动SDBOne,因为它需要先定义的类,然后才能从中扩展SDB。 按需自动加载父类的情况与尝试加载继承的类时发生的情况相同。

此外,应考虑切换到 spl_autoload_register,以便您的代码能够很好地与可能使用自动加载器的其他代码配合使用。 SPL 自动加载器支持多个自动加载器,并按注册顺序创建堆栈。 这样,如果第一个自动加载器不满足要求,它会继续尝试随后注册的自动加载器,直到加载或找不到类。

关于防止错误的另一个注意事项,您可能需要更改自动加载功能,如下所示:

function __autoload( $class_name ) { 
    $file = 'class.' . $class_name . '.php';
    if (file_exists($file)) {
        include $file;
    }
}

因为如果自动加载的类不存在,您将收到有关包含不存在的文件的错误。 这在使用spl_autoload_register时尤其重要;如果另一个自动加载器最终负责加载有问题的类,则不希望自动加载器发出有关丢失文件的不必要警告。

希望有帮助。