Accueil du blog

Archives

CamelCase, underscore, PEAR conventions, convertir la casse des noms en PHP, classes, fonctions, méthodes, variables, constantes - Part 2

Voici quelques applications pratiques avec la fonction que nous avons mise au point dans l'article précédent. A nous les variables variables, classes et noms de fonctions variables!

Commentaires : 0

Imaginons que nous ayons un site au code orienté objet inspiré du modèle MVC (Modèle-Vue-Controller) dans lequel il existe un analogie de noms. Cette analogie peut être grandement bénéfique pour la cohérence et la simplicité du code. Attention tout de même, pour réaliser de véritables applications à partir des codes suivants, il faudra considérer l'aspect sécurité plus en profondeur.

Supposons que les développeurs se sont arrangés pour que dans l'url, il n'y ait besoin que du nom du module + 1 paramètres pour router l'application.

Exemple : http://www.monsite.com/article_musique/23564/blablabla
Exemple : http://www.monsite.com/article_histoire/13459/blablabla

ici, on va considérer que le module c'est "article_" + son type, son paramètre "23564" et le titre de l'article "blablabla". On peut récupérer ces éléments avec un simple :

$url_ary = explode('/', $_SERVER['REQUEST_URI']);
$module = $url_ary[1];
$module_param = $url_ary[2];

Evidemment, la restriction c'est que les paramètres eux-mêmes ne contiennent pas "/".

Maintenant, on va envisager que le paramètre $module conditionne le choix du contrôleur principal de la page. Dans ce cas, pour avoir le nom complet de ce contrôleur, il suffit de faire:

$nom_classe = $module.'Controller';

Puis on instantie ce contrôleur:

new $nom_classe($module_param);

A noter qu'on est obligé ici de créer une variable complète avant de s'en servir pour instantier un objet dynamiquement. En effet, si on tente de concaténer une variable et une chaîne de caractères au moment de l'instantiation comme on aurait envie ici...

$ctrl = new $module.'Controller';

...cela va nous donner une belle erreur. Il faut avoir le nom complet en variable.

Mais un instant : il est rare d'avoir un nom de classe comme ça "article_musiqueController". On préfèrerait ArticleMusiqueController par exemple. C'est là qu'intervient notre fonction caseConverter.

$nom_classe = caseConverter($module, 'WeWe').'Controller';

if(file_exists('controllers/'.$nom_classe.'.php'))
{
        require_once('controllers/'.$nom_classe.'.php');
        $ctrl = new $nom_classe($module_param);
}

Voilà, on a créé dynamiquement notre classe.

Ensuite disons que dans notre moteur de templates, nous ayons besoin du nom d'une méthode au nom dynamique nom + 'View', qui prend en charge l'affichage du module. Il suffit de faire quelque chose comme:

$template_obj = new Template;
$method_name = caseConverter($module, 'weWe').'View';
$template_obj->$method_name();

Ensuite imaginons que nous ayons à créer une constante à partir de ce nom de module, rien de plus simple:

define(caseConverter($module, 'WE_WE'), $module_param);

Et ainsi de suite...

Ecrire un commentaire

Captcha - Illisible?