2010-11-04 4 views
0

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?

+0

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

+0

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 –

Répondre

0

J'aime l'idée de base. Mais la mise en œuvre est plutôt terrible. Imaginez que je mets nav=../../../../../../etc/passwd. Cela (en fonction de la configuration de votre serveur) me permettrait d'accéder à votre fichier de mot de passe, ce qui n'est certainement pas bon.

+0

bien sûr, ce n'est qu'un exemple, pas une implémentation complète, je devrais avoir une vérification de sécurité au fond. –

+0

Euh, j'espère au _top_ (avant d'inclure les fichiers bruts, qui en PHP les enverraient directement à STDOUT/l'utilisateur). – Wrikken

+0

oui, désolé, je voulais dire au sommet de mon script index.php –

Questions connexes