繁体   English   中英

每个人的意思是:“ spl:_autoload()是__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 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查看由spl_autoload_extensions();设置的扩展名spl_autoload_extensions(); 然后从包含路径导入具有这些扩展名的所有文件? 重复前面提到的问题: spl_autoload()内部函数吗?

我知道__autoload()已过时,我应该使用spl_autoload_register() 我只想确保我知道所有工作原理。

谢谢。

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

如果您不传递参数,那只是spl_autoload_register的“默认值”。 如果需要,您也可以独立调用此函数。 可以使用spl_autoload_extensionsset_include_path配置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_extensionsset_include_path的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM