PHP Conference Japan 2024

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 条注释

-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
-4
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');

/* 抛出:致命错误:无法在 /parent.class.php 的第 2 行重新声明类 Parent */
spl_autoload_call('Parent');

?>
To Top