1

我对关于 php 自动加载的东西的一件事感到困惑:spl_autoload()函数。在每个答案中,我发现此功能是__autoload. PHP不应该自己定义默认实现,__autoload()然后如果我明确创建__autoload()它只会覆盖它?

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

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

引用自:什么是自动加载;如何使用 spl_autoload、__autoload 和 spl_autoload_register?

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

由于 spl_autoload 是 __autoload() 魔术方法的默认实现,当您尝试实例化一个新类时,PHP 将调用 spl_autoload。

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

我知道这__autoload()已被弃用,我应该使用spl_autoload_register(). 我只是想确保我知道这一切是如何运作的。

谢谢。

4

1 回答 1

2

重复前面提到的问题:是spl_autoload()内部函数吗?

spl_autoload_register如果您不传递参数,那只是“默认值” 。如果您愿意,也可以单独调用此函数。spl_autoload 的行为可以用spl_autoload_extensions和配置set_include_path

在内部spl_autoload将全限定类名 (fqcn) 作为查找类实现的路径。(也许用字符串替换目录分隔符)。之后,它在给定文件之后的 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.

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

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_extensionsor的值set_include_path

于 2018-04-28T16:33:33.327 回答