J'aurais besoin d'utiliser des fonctions silencieuses (ou quiet evaluation selon la terminologie PHP), mais je ne sais pas comment faire ça. Je m'explique.
Le seul exemple de fonction silencieuse que je connaisse est la fonction assert() : si la configuration du php.ini le permet, la fonction s'exécute, sinon elle ne s'exécute pas.
J'aurais besoin d'avoir le même comportement. Je me suis donc pencher sur le code source pour comment ça se passait. J'ai regardé dans php-x.x.x/ext/standard/assert.c, à la ligne 138 on trouve la déclaration de la fonction et à la ligne 145, dans son corps :
Code : Tout sélectionner
if (! ASSERTG(active)) {
RETURN_TRUE;
}Code : Tout sélectionner
#ifdef ZTS
#define ASSERTG(v) TSRMG(assert_globals_id, zend_assert_globals *, v)
#else
#define ASSERTG(v) (assert_globals.v)
#endif
Donc rien n'a l'air prévu dans le code PHP pour ça. On ne peut pas détourner l'évaluation d'une fonction (via un callback ou un truc du genre).
On pourrait faire par contre :
function_exist('my_toto') and my_toto(arg1, …, argn); mais c'est trop long à écrire, je ne veux pas ça.Dernière solution, mais connue pour être sale : l'utilisation de l'extinction d'erreur via l'arobase (@). On aurait alors :
@my_toto(arg1, …, argn); C'est une solution qui me sied, mais c'est un peu … sale non ? Ça ne me dérangerait pas d'utiliser cette technique mais il faut (sa)voir si ça n'embête pas trop PHP. Normalement, on ne devrait pas avoir de ralentissement.Pourquoi je veux faire ça ?
Imaginez un système de tests où l'on écrirait les tests en PHP, et pas via un langage d'assertion en commentaire. Les tests seront toujours écris mais seulement exécutés si et seulement si le paquetage de tests est présent, sinon rien ne se passe. L'utilisation de l'extinction d'erreur me semble adaptée même si c'est un moyen détourné.
Je ne vois pas d'autres façons de faire, et vous ?
Un autre avantage de la fonction assert() et que le code à tester est passé sous forme de chaîne de caractères, donc il n'y a pas d'évaluation du code. On pourrait simuler le même comportement, mais ça va être galère pour retrouver les données (variables, constantes etc.) dans le bon contexte.
Et oui, il existe assert_options() qui permet de détourner/rediriger les assertions (un simple callback dynamique), mais la fonction assert() — même si elle a des avantages — reste trop limitée.
Autre précision après relecture : quand je dis que le code n'est pas évalué, je parle du code passé en argument, car dans tous les cas, la fonction assert() est appelée, mais on regarde si on sort directement ou si on effectue le travail. Pour l'arobase, ce serait pareil : la fonction est appelée et exécutée si elle existe, sinon rien.