Dans un système que nous allons utiliser, il y a une fonction appelée "uses". Si vous êtes familier avec pascal, la clause uses est l'endroit où vous indiquez à votre programme quelles dépendances il a (comme C et PHP). Cette fonction est utilisée pour contrôler l'inclusion des fichiers autre que include (_once) ou require (_once).PHP Constante chaîne de caractères jeton
Dans le cadre des procédures de test, j'ai besoin d'écrire un outil de visualisation des dépendances pour les fichiers chargés statiquement.
Loaded Exemple statiquement: uses('core/core.php','core/security.php');
Loaded Exemple Dynamiquement: uses('exts/database.'.$driver.'.php');
Je dois filtrer les cas de charge dynamique, car le code est testé de manière statique, et non lors de l'exécution.
C'est le code que je utilise à ce moment:
$inuses=false; // whether currently in uses function or not
$uses=array(); // holds dependencies (line=>file)
$tknbuf=array(); // last token
foreach(token_get_all(file_get_contents($file)) as $token){
// detect uses function
if(!$inuses && is_array($token) && $token[0]==T_STRING && $token[1]=='uses')$inuses=true;
// detect uses argument (dependency file)
if($inuses && is_array($token) && $token[0]==T_CONSTANT_ENCAPSED_STRING)$tknbuf=$token;
// detect the end of uses function
if($inuses && is_string($token) && $token==')'){
$inuses=false;
isset($uses[$tknbuf[2]])
? $uses[$tknbuf[2]][]=$tknbuf[1]
: $uses[$tknbuf[2]]=array($tknbuf[1]);
}
// a new argument (dependency) is found
if($inuses && is_string($token) && $token==',')
isset($uses[$tknbuf[2]])
? $uses[$tknbuf[2]][]=$tknbuf[1]
: $uses[$tknbuf[2]]=array($tknbuf[1]);
}
Note: Il peut être utile de savoir que j'utilise un moteur d'état pour détecter les arguments.
Mon problème? Comme il y a toutes sortes d'arguments qui peuvent entrer dans la fonction, il est très difficile de bien faire les choses. Peut-être que je n'utilise pas la bonne approche, cependant, je suis assez sûr que l'utilisation token_get_all
est le meilleur dans ce cas. Alors peut-être que le problème est mon moteur d'état qui n'est vraiment pas très bon. J'ai peut-être manqué la solution de facilité, je pensais que j'aurais une critique par les pairs.
Editer: J'ai pris l'approche d'expliquer ce que je fais cette fois, mais pas exactement ce que je veux. Mettez en mots simples, j'ai besoin d'obtenir un tableau des arguments transmis à une fonction nommée "uses". La chose est que je suis un peu spécifique sur les arguments; J'ai juste besoin d'un tableau de chaînes droites, pas de code dynamique du tout (constantes, variables, appels de fonctions ...).
Puis-je demander pourquoi ne pas utiliser simplement le chargement automatique des classes? – Mchl
Vraiment, oubliez le regex = mème diabolique. Ceci est ** un cas d'utilisation pour eux. – mario
@Mchl - Parce que cela ne concerne pas spécifiquement les classes. @Mario - Certes, je ne suis pas très bon avec les expressions rationnelles. Dans les deux cas, je regex pour analyser le code PHP serait difficile à créer et à maintenir, et assez lent à fonctionner. – Christian