Auto-chargement de classes

De nombreux développeurs qui écrivent des applications orientées objet créent un fichier source par définition de classe. Un des plus gros inconvénients de cette méthode est d'avoir à écrire une longue liste d'inclusions de fichier de classes au début de chaque script : une inclusion par classe.

En PHP 5, ce n'est plus nécessaire. La fonction spl_autoload_register() enregistre un nombre quelconque de chargeurs automatiques, ce qui permet aux classes et aux interfaces d'être automatiquement chargées si elles ne sont pas définies actuellement. En enregistrant des autochargeurs, PHP donne une dernière chance d'inclure une définition de classe ou interface, avant que PHP n'échoue avec une erreur.

Astuce

Bien que la fonction __autoload() puisse également être utilisée pour le chargement automatique des classes et des interfaces, il est préférable d'utiliser la fonction spl_autoload_register(). Cela est dû au fait qu'il s'agit d'une alternative plus flexible (permettant de spécifier un nombre quelconque de chargeurs automatique dans l'application, par exemple dans les bibliothèques tierces). Pour cette raison, l'utilisation de __autoload() est découragée et est obsolète à partir de PHP 7.2.

Note:

Avant PHP 5.3, les exceptions lancées depuis la fonction __autoload() ne pouvaient pas être interceptées par un bloc catch et provoquaient une erreur fatale. Depuis PHP 5.3 et supérieur, cela est possible a condition que si vous lancez une exception personnalisée, alors la classe de cette exception doit être disponible. La fonction __autoload() peut être utilisée récursivement pour charger automatiquement la classe de l'exception personnalisée.

Note:

L'auto-chargement n'est pas disponible si vous utilisez PHP en mode interactif CLI.

Note:

Si le nom de la classe est utilisé par exemple dans la fonction call_user_func(), alors il peut contenir des caractères dangereux comme ../. Il est recommandé de ne pas utiliser d'entrées utilisateur dans de telles fonctions, ou, au moins, de vérifier l'entrée dans la fonction __autoload().

Exemple #1 Exemple avec __autoload()

Cet exemple tente de charger les classes MaClasse1 et MaClasse2, respectivement depuis les fichiers MaClasse1.php et MaClasse2.php.

<?php
spl_autoload_register
(function ($class_name) {
    include 
$class_name '.php';
});

$obj  = new MaClasse1();
$obj2 = new MaClasse2();
?>

Exemple #2 Autre exemple d'auto-chargement

Cet exemple tente de charger l'interface ITest.

<?php

spl_autoload_register
(function ($name) {
    
var_dump($name);
});

class 
Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>

Exemple #3 Auto-chargement avec gestion des exceptions en PHP 5.3.0+

Cet exemple lance une exception et montre comment la traiter avec un bloc try/catch.

<?php
spl_autoload_register
(function ($name) {
    echo 
"Tentative de chargement de $name.\n";
    throw new 
Exception("Impossible de charger $name.");
});

try {
    
$obj = new NonLoadableClass();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

L'exemple ci-dessus va afficher :

Tentative de chargement de NonLoadableClass.
Impossible de charger NonLoadableClass.

Exemple #4 Auto-chargement avec gestion des exceptions en PHP 5.3.0+. Exception personnalisée manquante

Cet exemple lance une exception personnalisée non-chargeable.

<?php
spl_autoload_register
(function ($name) {
    echo 
"Tentative de chargement de $name.\n";
    throw new 
MissingException("Impossible de charger $name.");
});

try {
    
$obj = new NonLoadableClass();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
?>

L'exemple ci-dessus va afficher :

Tentative de chargement de NonLoadableClass.
Tentative de chargement de MissingException.

Fatal error: Class 'MissingException' not found in testMissingException.php on line 4