每个人的意思是:' spl:_autoload()是__autoload()'的默认实现。

时间:2018-04-28 12:13:17

标签: php autoloader spl spl-autoloader

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

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

(如果它不是内部函数)在每个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();
     

由于spl_autoload是__autoload()的默认实现   魔术方法,PHP会在你尝试实例化时调用spl_autoload   一个新的课程。

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

  

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

这只是"默认值"如果您没有传递参数,请spl_autoload_register。如果您愿意,也可以单独调用此函数。可以使用spl_autoload_extensionsset_include_path配置spl_autoload的行为。

内部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_extensionsset_include_path的值。