La fonction magique __autoload() est chargée d'inclure les classes que le programme aurait besoin pour son exécution.
function __autoload($nom_classe) { require_once $nom_classe . '.php'; }
Lors de l'exécution d'un programme, PHP appelera automatiquement la fonction __autoload() dès qu'il rencontrera une classe inconnue. La fonction __autoload() tentera alors de trouver la classe adéquate.
//Fichier Classe.php class Classe { public function __autoload($nom){ if(include_exists($nom . '.inc')) { include_once($nom . '.inc'); } } } $obj = new Classe(); //Appel automatique de __autoload() //Fichier Classe1.inc class Classe1 { //... }
L'utilisation efficace de cette fonction demande de se conformer à certaines règles.
Premièrement, il faut que chaque classe possède son propre fichier et que ce dernier porte le même nom que la classe, avec exactement la même orthographe et la même casse de caractères (majuscule et minuscule).
Deuxiémement, que tous les fichiers portent la même extension (ex.: .php ou .inc).
Troisièmement, dans le cas, d'un programme complexe faisant appel à des classes concrètes, abstraites et des interfaces, il peut être souhaitable de préfixer chaque type de fichier par une expression afin d'éviter toutes ambiguités.
cls_UneClasseConcrete.php abs_UneClasseAbstraite.php int_UneInterface.php
Le non-respect des deux premières règles provoquera certainement des difficultés dans l'élaboration du code de la fonction __autoload(), puisqu'il faudra composer avec divers extensions et des noms de fichiers qui ne correspondront pas forcément aux noms de classes.
<?php function __autoload($name) { $class = $interface = false; //Interface if (include_exists("interface.$name.inc")) { include_once("interface.$name.inc"); $interface = true; } //Classe if (include_exists("class.$name.inc")) { include_once("class.$name.inc"); $class = true; } //Si l'interface ou la classe n'a pas été trouvée if ($class === false && $interface === false) { trigger_error("Impossible d'inclure l'interface " . "ou la classe $name", E_USER_WARNING); return false; } return true; } function include_exists($file) { static $include_dirs = null; static $include_path = null; // set include_dirs if (is_null($include_dirs) || get_include_path() !== $include_path) { $include_path = get_include_path(); foreach (split(PATH_SEPARATOR, $include_path) as $include_dir) { if (substr($include_dir, -1) != '/') { $include_dir .= '/'; } $include_dirs[] = $include_dir; } } if (substr($file, 0, 1) == '/') { //absolute filepath - what about file:///? return (file_exists($file)); } if ((substr($file, 0, 7) == 'http://' || substr($file, 0, 6) == 'ftp://') && ini_get('allow_url_fopen')) { return true; } foreach ($include_dirs as $include_dir) { if (file_exists($include_dir.$file)) { return true; } } return false; } // voir http://www.php.net/manual/en/language.oop5.autoload.php ?>