Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
14 janvier 2010 4 14 /01 /janvier /2010 20:59

Depuis PhP5 on entend souvent parler de méthodes magiques. Non, elles ne sortent pas de lapins de leurs chapeaux, elles sont juste bien pratiques et viennent combler certains trous.

 

Pour faire simple, les méthodes magiques permettent de se simplifier la vie en venant à votre rescousse au moment opportun. Par exemple __get() et __set() permettent de gérer les propriétés d'un objet et donc de faire une seule fonction qui gère la modification et/ou la lecture des propriétés d'un objet plutôt que d'en faire une par propriété.

 

Je ne vais pas m'attarder là dessus, ce n'est pas le but de cet article et j'imagine que pas mal d'entre vous connaissent déjà. Pour les autres, les articles parlant de ça sont foison sur le net, sinon, j'en parlerais peut être dans un autre article, on verra bien.

 

Si je parle de ces méthodes magiques, c’est simplement parce que ce dont on va parler maintenant est souvient lié dans la plupart des articles qu’on trouve sur le sujet. Une des « méthodes magiques », qui en fait n'est pas une méthode mais une fonction est __autoload().C'est de celle-ci qu'on va parler.

 


 

__autoload()

 

 

__autoload() est une fonction bien pratique : elle charge les fichiers « à chaud » pendant l'exécution. Souvenez vous, autre fois, si vous aviez trois classes « Administrateur », « Redacteur » et  « Correcteur » dans une application quelconque et que vous aviez besoin de créer un objet en fonction de l'utilisateur qui venait de se connecter.  Bien souvent, au tout début de votre fichier étaient inclus trois fichiers (un par classe).

 

Pourquoi ? Simplement parce que vous ne saviez pas de laquelle vous aurez besoin avant que l'utilisateur soit connecté, il fallait donc tout charger (je sais qu'on aurait pu gruger pour n'en charger qu'un mais pour l'exemple on fera comme si on ne savait pas).

 

Maintenant c'est finit ! Miracle de l'évolution, grâce à la fonction __autoload() on peut charger le fichier juste quand on en a besoin de manière très propre. Comment me demanderez vous ? Et bien aussi simplement que ça :

 

 

 

function loadingClasses($class_name){

 

require_once(CHEMIN_DU_DOSSIER_DES_FICHIERS_CLASSES.$class_name.'.class.php');

 

 }

 

 

Pas compliqué n'est ce pas ? Lorsque vous créez une instance d’un nouvel objet et que PhP ne le connait pas, il appel immédiatement la fonction reçoit en paramètre le nom de la classe en question. Ensuite, libre à vous de faire le require_once comme vous le voulez. Si les fichiers respectent une règle de nommage un minimum cohérente, une seule ligne est suffisante.

 

  


 

spl_autoload_register

 

 

Jusque là tout va pour le mieux dans le meilleur des mondes possibles. Mais pas de chance, comme je ne suis pas gentil je vais compliquer les choses.

 

Imaginez que vous ayez votre petite application avec sa fonction __autoload() qui fonctionne on ne peut  mieux et que, pour une raison qui ne regarde que moi, je vous demande d’y inclure un développement fait par une autre personne qui définit aussi sa propre fonction __autoload(). La vous aurez un problème : PhP n’aime pas trop que deux fonctions aient le même nom et vous allez devoir repasser sur votre fonction __autoload() pour y inclure le chargement des autres classes.

 

Si on pousse le vice un peu loin, imaginez maintenant que c’est votre code à vous qui va être intégré dans le code d’un autre et que cet autre n’est pas spécialement un expert du PhP et qu’il a juste envie de copier les fichiers et que ça marche.

 

Rassurez vous ! Vous n’êtes pas perdu. Heureusement il existe une autre fonction en PhP qui s’appelle spl_autoload_register(). Cette fonction est très simple à utiliser : elle prend en paramètre le nom d’une fonction.

 

 

< ?php

spl_autoload_register('loadingClasses1');

spl_autoload_register('loadingClasses2');

?>

 

 

Si vous utilisez ce petit bout de code, lorsque PhP rencontrera une classe qu’il ne connaît pas, il appellera la fonction « loadingClasse21 ». Si après cet appel la classe n’est toujours pas connues, il appellera alors « loadingClasses2 ».

 

Voilà, vous pouvez maintenant définir autant de fonction que vous voulez pour charger vos classes. Il peut y en avoir une par « module » de l’application, une pour vos propres classes et une pour les modules inclus, …

 

D’autres fonctions SPL pourraient vous intéresser, un petit coup d’œil ne peut pas faire de mal. On en reparlera peut être une autre fois.

 

 


 

Sources : http://be.php.net/manual/fr/ref.spl.php

http://php.net/manual/fr/language.oop5.magic.php

 

Partager cet article
Repost0

commentaires

Présentation

  • : Carnet de route d'un développeur PhP...
  • : Ah ! Une description... Ben en fait je me disais que j'allais faire un blog depuis longtemps, sauf que c'était juste pour y stocker des trucs pour moi, des espèces de post-it virtuels. Bon tant qu'à faire autant qu'il te profite à toi aussi.
  • Contact

Recherche

Liens