Jusqu'ici, nous avons défini les classes et nous les avons instancié pour nous servir des objets qui en sont les instances, et tout ceci dans la même page PHP. Bien que ça marche, ce n'est cependant pas une méthode de travail propre et organisée.
Imaginons un instant qu'on aura besoin de 6 classes qui seront instanciées toutes dans le même document PHP. Vous imaginez la pagaille!
La solution qui parait évidente consiste à déclarer chaque classe dans un document PHP à part. En effet, les développeurs PHP ont pour coutume de nommer la page qui contient la définition de la classe avec le même nom que celle-ci suivi de .class puis .php. Le .class sert à distinguer les pages de définition de classes des pages ordinaires.
Pour mieux comprendre, imaginons qu'on veut créer la classe String de l'exercice précédent. Le fichier qui la contiendra sera nommé: String.class.php.
Le fichier de définition de la classe désormais créé, on peut alors l'inclure dans la page où on en aura besoin comme ceci:
<?php
include("String.class.php");
?>
Mieux encore, on peut créer une fonction qui se charge d'inclure la page souhaitée en lui passant, en argument, le nom de la classe comme ceci:
<?php
function appel($classe){
include($classe.".class.php");
}
?>
Pour inclure le fichier qui contient la classe String on fait alors:
<?php
appel("String");
?>
Bien entendu, il faut placer toutes les pages qui contiennent des définitions des classes au même emplacement.
Cependant, un problème subsiste. En effet, si on veut inclure plusieurs classes, il faut appeler la fonction plusieurs fois. Cette opération est fastidieuse et en plus elle peut induire à l'erreur, car on pourrait bel et bien oublier d'appeler une page si ce n'était pas plusieurs.
Auto chargement de classes (Autoload)
A partir de la version 5 de PHP, une fonctionnalité qui permet le chargement dynamique des classes est apparue permettant ainsi de faciliter au développeur l'inclusion des fichiers dont il aura besoin.
Fonction spl_autoload_register()
La fonction spl_autoload_register() enregistre une fonction de notre choix dans la pile d'autoload. Cette pile est destinée à enregistrer des fonctions et les appeler, d'une manière implicite, quand on en aura besoin. De cette manière, si on fait appel à une classe (instanciation, héritage ou appel statique d'un membre) l'autoload se charge d'appeler la fonction qui permet d'inclure la classe souhaitée.
Supposons que la fonction qui inclue les fichiers de classes est la appel($classe) vue précédemment:
<?php
function appel($classe){
include($classe.".class.php");
}
?>
Pour enregistrer cette fonction dans la pile d'autoload on fait comme ceci:
<?php
spl_autoload_register("appel");
?>
On passe le nom de la fonction en tant que chaîne de caractères en guise d'argument de la fonction spl_autoload_resigter(). Dans ce cas, le moindre code qui invoque une classe quelconque pousse le compilateur à charger une à une les différentes fonctions enregistrées dans la pile, y compris la fonction appel(), en leur passant comme paramètre le nom de la classe.
Exemple
Contenu de la page String.class.php:
<?php
class String{
private $str;
private $length;
public function __construct($chaine){
$this->str=$chaine;
$this->length=strlen($this->str);
}
}
?>
Contenu de la page index.php (qui est placée, dans cet exemple, au même emplacement que String.class.php):
<?php
function appel($classe){
include($classe.".class.php");
}
spl_autoload_register("appel");
$str=new String("Bonjour");
?>
Au moment d'instancier la classe String, le fichier qui contient sa définition (String.class.php) est automatiquement inclus.
Supposons maintenant qu'on exécute le code suivant:
<?php
function appel($classe){
include($classe.".class.php");
}
spl_autoload_register("appel");
$str=new Date();
?>
On obtient le résultat suivant:
Warning: include(Date.class.php) [function.include]: failed to open stream: No such file or directory in index.php on line 3
Vous avez remarqué que le compilateur est allé immediatement chercher le fichier du nom Date.class.php. Cependant ce fichier n'existe pas.