0

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

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

4

1 回答 1

1

您是对的,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;时尤其重要。如果另一个自动加载器最终负责加载相关类,您不希望您的自动加载器发出有关丢失文件的不必要警告。

希望有帮助。

于 2012-08-07T22:41:02.687 回答