J'avais besoin de créer des breadcrumb dynamiques qui doivent être réalisés automatiquement par l'application. J'ai donc la structure suivante dans l'URL pour navagation: nav = user.listPMs.readPM & args = 5PHP - Résolution de problèmes avec les fermetures et la réflexion
alors je pourrais avoir une fonction de fichier dont le seul but serait de définir la fonction de user.listPMs.readPM lui-même:
fichier : nav/user.listPMs.readPM.php
function readPM($msgId)
{
/*code here*/
}
Bien sûr, cela finit par encombrer la portée globale puisque je ne suis pas envelopper la fonction withing une classe ou en utilisant les espaces de noms. La meilleure solution ici semble être le namespacing, sans aucun doute non? Mais je pensais aussi à un autre:
fichier: nav/user.listPMs.readPM.php
return function($msgId)
{
/*code here*/
};
Eh oui, aussi simple que cela, le fichier renvoie simplement une fonction anonyme. Je pense que c'est génial parce que je n'ai pas besoin de me soucier de le nommer - puisque j'ai déjà correctement nommé le fichier qui le contient, créant une fonction utilisateur et pourtant avoir à le nommer semblerait juste redondant. Puis, dans l'index j'aurais ce petit truc sale:
fichier : index.php
if($closure = @(include 'nav/'.$_GET['nav']))
{
if($closure instanceof Closure)
{
$obj = new ReflectionFunction($closure);
$args = explode(',',@$_GET['args']);
if($obj->getNumberOfParameters($obj)<=count($args))
call_user_func_array($closure,$args);
else
die('Arguments not matching or something...');
} else {
die('Bad call or something...');
}
} else {
die('Bad request etc.');
}
Ne même pas besoin de mentionner que les BreadCrumbs peuvent être bien construit ce dernier juste en analysant la valeur dans la variable $ _GET ['nav']. Alors, qu'en pensez-vous, y a-t-il une meilleure solution à ce problème? Avez-vous trouvé un autre moyen d'explorer les fermetures et/ou la réflexion?
Veuillez ne pas compter sur les fermetures étant 'instanceof Closure'. Ceci est un détail d'implémentation interne et le manuel vous demande explicitement de ne pas l'utiliser, car il pourrait changer dans le futur. – NikiC
C'est vrai, j'ai oublié de faire mes devoirs sur php.net. Merci pour l'avertissement! Donc, je vais utiliser is_callable ($ closure) à la place –