spl_autoload_call

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

spl_autoload_call尝试所有注册的 __autoload() 函数来加载请求的类

说明

spl_autoload_call(string $class): void

此函数可用于使用注册的 __autoload 函数手动搜索类或接口。

参数

class

正在搜索的类名。

返回值

不返回值。

添加说明

用户贡献的说明 2 个说明

Melnofil
3 年前
带命名空间的完整示例

fruits/pinapple.php

<?php
namespace Fruits;
echo
"pinapple\n";
class
Pinapple { }
?>

fruits/pinapple.php

<?php
namespace Vegetables;
use
Fruits\Pinapple;
echo
"carrot\n";
class
Carrot { }
new
Pinapple(); // 在这里调用自动加载
?>

index.php

<?php
spl_autoload_register
(function($class_name) {
@include_once(
__DIR__ . '/' . strtolower(str_replace('\\', '/', $class_name)) . '.php');
});
new
Vegetables\Carrot();
?>

结果

carrot
pinapple

index2.php

<?php
spl_autoload_register
(function($class_name) {
@include_once(
__DIR__ . '/' . strtolower(str_replace('\\', '/', $class_name)) . '.php');
});
spl_autoload_call('Fruits\\Pinapple'); // 反转加载顺序
spl_autoload_call('Fruits\\Pinapple'); // 多次调用在 include_once 中是安全的
new Vegetables\Carrot();
?>

结果

pinapple
carrot
k dot varmark at gmail dot com
13 年前
需要注意的是,在子类上调用 spl_autoload_call,然后在父类上调用,会导致致命错误。

这是因为自动加载子类也会加载它扩展的类。由于 spl_autoload_call 强制调用注册的自动加载函数,而没有考虑类是否存在,因此会引发致命错误。

文件:child.class.php

<?php
class Child extends Parent () {
public function
__construct () {
parent::__construct();
}
}
?>

文件:parent.class.php

<?php
class Parent () {
public function
__construct () {

}
}
?>

文件:autoload.php

<?php

/* 运行良好 */
spl_autoload_call('Child');

/* 抛出:Fatal error: Cannot redeclare class Parent in /parent.class.php on line 2 */
spl_autoload_call('Parent');

?>
To Top