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

Php 自动加载器似乎无所不知|不需要嵌套的包含,php,autoloader,Php,Autoloader,我使用以下简单的自动加载器代码: function __autoload( $class_name ) { include 'class.' . $class_name . '.php'; } 我做了这个调用newsdb() SDB实际上继承自我从未包含的SDBOne,但自动加载程序会加载它 这意味着它知道如何加载嵌套/包含在其他模块中的模块 因此,从外观上看,如果我使用自动加载器,我永远不需要要求或包含任何内容 但是,如果我使用一个没有自动加载程序的独立模块,那么我需要包含它从中继承的类 我

我使用以下简单的自动加载器代码:

function __autoload( $class_name ) { include 'class.' . $class_name . '.php'; }
我做了这个调用
newsdb()

SDB
实际上继承自我从未包含的
SDBOne
,但自动加载程序会加载它

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

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

但是,如果我使用一个没有自动加载程序的独立模块,那么我需要包含它从中继承的类

我应该用吗

require,

require_once,

include,

include_once.
我想使用一次
require_
,因为我想要的是一个错误而不是一个警告……另外,当我在自动加载器上使用代码时,我不希望它加载两次

基本上,我有两种SDB的使用方式:一种是有自动加载器的,另一种是没有自动加载器的

参考


您是正确的,
require\u once
将是在一个文件中包含父类或依赖类的正确方法。这样,如果多次包含,则
require_once
可防止因重新声明类而产生的错误

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

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

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

function __autoload( $class_name ) { 
    $file = 'class.' . $class_name . '.php';
    if (file_exists($file)) {
        include $file;
    }
}
因为如果要自动加载的类不存在,则会出现包含不存在文件的错误。当使用
spl_autoload_寄存器时,这一点尤其重要;如果另一个自动加载器最终将负责加载有问题的类,您不希望您的自动加载器发出关于丢失文件的不必要警告


希望这能有所帮助。

防守编码……永远不要,进攻是最好的防守。:)@男主角:)是的,我总是在进攻