每个人的意思是什么:'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_extensions
和 set_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_extensions
或set_include_path
的值。
我对 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_extensions
和 set_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_extensions
或set_include_path
的值。