Utilisation de classe "namespacée" en tant que filtre.
Hello World,
J'ai depuis longtemps déjà utilisé certaines méthodes de classes en tant que filtre. Quelque chose dans le style [(#REM|MaClasse::MaMethod)]
et pour ça aucun soucis.
Cependant, j'ai eu dernièrement besoin de recourir à une classe d'une librairie, cette classe possédant un namespace.
L'appel "Classique" [(#REM|MaClasse::MaMethod)]
me renvoie une erreur de squelette ( rien d'anormal selon moi ), mais l'appel à ma Classe via l'utilisation du namespace en fait de même : [(#REM|NameSpace\MaClasse::MaMethod)]
J'ai pourtant remarqué dans cette fonction ( => https://git.spip.net/spip/spip/src/branch/master/ecrire/inc/filtres.php#L76 ) que l'utilisation des namespace devait être prise en charge.
Seulement voilà, j'ai noté 2 soucis potentiels.
1 ) - Dans la 1ère partie du test ( l.100 ), cette Regex preg_match("/^(\w*)::(\w*)$/", $f, $regs)
ne match aucun backspace. Dès lors, impossible de détecter un namespace.
2 ) - La seconde partie du test and is_callable(array($regs[1], $regs[2]))
ne fonctionne qu'avec une classe sans namespace, ou $regs[1] = MaClass et $regs[2] = MaMethod
Une correction possible serait de rajouter un test ( elseif, if, etc. ) pour ces cas là avec un contenu de test semblable ?
preg_match("/^([a-zA-Z_\\\\]*?)\\\\?([a-zA-Z_]*)::([a-zA-Z_]*)$/", 'NameSpace\MaClass::MaMethod', $regs); // Nb le quadruple backspace est volontaire pour une utilisation en php $className = $regs[1].'\\'.$regs[2]; // $regs[1] = NameSpace et $regs[2] = MaClass is_callable(array(new $className(), $regs[3])); // true si la fonctione existe. Noter qu'on passe à is_callable une instance de la classe ? ( cf.http://php.net/manual/fr/function.is-callable.php )
Peut-être est-ce hors sujet ? Quoi qu'il en soit le débat ( et l'issue ) sont ouverts, je vous laisserais le soin de les fermer si ce n'est pas pertinent.
Cordialement.
Witi