PHP Conference Japan 2024

spl_autoload_call

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

spl_autoload_call嘗試所有已註冊的 __autoload() 函式來載入請求的類別

說明

spl_autoload_call(字串 $class):

此函式可用於使用已註冊的 __autoload 函式手動搜尋類別、介面、trait 或列舉。

參數

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