每个人的意思是什么:'spl:_autoload() is default implementation of __autoload()'

What does everyone mean by: 'spl:_autoload() is default implementation of __autoload()'

我对 php 自动加载的一件事感到困惑:spl_autoload() 函数。在每个答案中我都发现这个函数是 __autoload 的默认实现。 PHP 不应该定义 __autoload() 本身的默认实现,然后如果我显式创建 __autoload() 它会覆盖它吗?

如果我没有在 php 文件中明确定义 __autoload() 函数,是否会有默认实现? spl_autoload() 是某种内部函数吗?如果是,为什么它在 php 文档中?

(如果它不是内部函数)在每个 spl_autoload() 示例中没有对此函数的任何调用,只有 spl_autoload_register 没有参数,spl_autoload_extensions 等等在。为什么这样?我错过了什么?

引用自:What is Autoloading; How do you use spl_autoload, __autoload and spl_autoload_register?

set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();

Since spl_autoload is the default implementation of the __autoload() magic method, PHP will call spl_autoload when you try and instantiate a new class.

所以如果我不调用 spl_autoload_register(),它就不会注册默认实现吗? spl_autoload 是否查看由 spl_autoload_extensions(); 设置的扩展名,然后从包含路径导入所有具有这些扩展名的文件?重复前面提到的问题:spl_autoload()是内部函数吗?

我知道 __autoload() 已被弃用,我应该使用 spl_autoload_register()。我只是想确保我知道它是如何工作的。

谢谢。

Repeating question mentioned earlier: is spl_autoload() internal function?

如果您不传递参数,那只是 spl_autoload_register 的 "default value"。如果需要,您也可以独立调用此函数。 spl_autoload 的行为可以用 spl_autoload_extensionsset_include_path.

配置

在内部 spl_autoload 将完全限定的 class 名称 (fqcn) 作为查找 class 实现的路径。 (也许用字符串替换目录分隔符)。之后,它会在给定文件之后搜索 class_include_path 的每个元素。

spl_autoload_extensions(".php");
spl_autoload_register();
$foo = new \foo\Bar();
// now spl_autoload tries to load the file foo/Bar.php inside your class path.

如果您需要更复杂的东西,您必须为自动加载器创建自己的回调。 IE。像这样

spl_autoload_register(function($class) {
    $path = 'classes' . DIRECTORY_SEPERATOR;
    // dont care about case
    $class = strtolower($class);
    // replace _ with DIRECTORY_SEPERATOR
    $name = str_replace('_', DIRECTORY_SEPERATOR, $class);
    // don't care about windows/unix
    $name = str_replace('/', DIRECTORY_SEPERATOR, $name);
    $file = $path . $name . '.php';
    if (file_exists($file)) {
        include ($file);
    }
});

注意:上面的例子不关心spl_autoload_extensionsset_include_path的值。