Auteur: Ludovic PATEY

Publié le 9 juin 2008

Modifié le: 9 juin 2008

Page d'accueil

Rendre les méthodes insensibles à la casse

Vous êtes ici : Accueil / Articles / Formations en PHP

Introduction

PHP est un sensible à la casse, c’est à dire qu’une méthode avec une majuscule sera différente d’une méthode avec une minuscule. Ainsi, le code suivant retournera une erreur :

<?php
class MaClasse {

       public function maMethode() {
               echo "Hello World";
       }

}

$objet = new MaClasse();

// Code générant une erreur à cause de la majuscule
$objet->MaMethode();
?>

Les fonctions et méthodes à utiliser

Pour obtenir notre résultat, nous allons avoir recours à une méthode magique et quelques fonctions que nous allons détailler :

- La méthode __call()

Cette méthode est appelée lorsque nous faisons appel à une méthode qui n’existe pas. Elle prends le nom de la méthode appelée en paramètre, ainsi qu’un tableau des arguments.

- La fonction get_class_methods()

Cette fonction retourne un tableau des méthodes de l’objet passé en paramètre ou du nom de la classe.

- La fonction call_user_func_array()

Cette fonction très puissante permet d’exécuter une méthode ou une fonction de manière dynamique en lui passant en paramètre le nom de la fonction et un tableau de paramètres.

Rendre l’appel des méthodes insensible à la casse

Il suffit de combiner les fonction introduites précédemment pour obtenir le résultat voulu :

<?php
class MaClasse {

       public function maMethode() {
               echo "Hello World";
       }

       public function __call( $nom, $arguments ) {

               // Pour chaque méthode de la classe
               foreach( get_class_methods( $this ) as $methode ) {

                       // Si la méthode est la même que celle appelée
                       if( strtolower( $methode ) == strtolower( $nom ) ) {

                               // Appeler la méthode dynamiquement
                               return call_user_func_array(
                               array( $this, $methode ),
                               $arguments );
                       }
               }

               // Par défaut, lancer une erreur
               trigger_error( 'Méthode inconnue', E_USER_ERROR );
       }

}

$objet = new MaClasse();

// Code ne générant pas d'erreur
$objet->MaMethode();
?>

Pour aller plus loin

Il est tout d’abord conseillé de créer une classe Caseless ne possédant que la méthode __call() et faire hériter toutes les classes de cette dernière.

Il est également possible d’imaginer une classe corrigeant les fautes de frappe grâce à la fonction levenshtein() qui retourne un entier représentant le nombre d’opérations à effectuer pour passer d’une chaîne à une autre.

Commentaires

Moi a dit le 15 novembre 2008

Quel est l’intérêt ?

Ludovic PATEY a dit le 15 novembre 2008

Aucun.
Saches que les méthodes ainsi que le nom des classes de PHP sont par défaut insensibles à la casse. C’était pour le plaisir d’écrire un article inutile. J’en ai tellement vu d’inutiles sur internet que j’avais envie d’en écrire un moi aussi.

Auteur :

Message :