PHP Conference Nagoya 2025

spl_autoload_call

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

spl_autoload_callПочергово викликає всі зареєстровані функції, що призначені для автозавантаження, намагаючись підключити запитуваний клас

Опис

spl_autoload_call(string $class_name): void

Цю функцію можна використовувати для ручного пошуку класа чи інтерфейса, серед функцій, зареєстрованих для автозавантаження.

Параметри

class_name

Назва класа для пошуку.

Значення, що повертаються

Не повертає значень.

add a note

User Contributed Notes 2 notes

up
-2
Melnofil
3 years ago
A complete example with namespaces:

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(); // Let's call autoload here
?>

index.php

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

Result:

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'); // Reverse the load order
spl_autoload_call('Fruits\\Pinapple'); // Multiple call is safe with include_once
new Vegetables\Carrot();
?>

Result:

pinapple
carrot
up
-4
k dot varmark at gmail dot com
13 years ago
It should be noted, that calling spl_autoload_call on a child class, and then on its parent class, throws a fatal error.

This happens because autoloading the child class also loads the class it extends. And since spl_autoload_call forcibly calls the registered autoload function(s), not taking into account whether the class exists, a fatal error is thrown:

File: child.class.php

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

File: parent.class.php

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

}
}
?>

File: autoload.php

<?php

/* works fine */
spl_autoload_call('Child');

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

?>
To Top