2010-04-19 2 views
3

J'ai besoin d'obtenir la liste des fonctions avec leur contenu (pas seulement le nom de la fonction) du fichier php. J'ai essayé d'utiliser regex mais il y a beaucoup de limitations. il n'analyse pas tous les types de fonctions. par exemple, il échoue si la fonction a des if et for loop instructions.Comment faire pour obtenir la liste des fonctions déclarées avec leurs données du fichier php?

en détails: J'ai environ 100 fichiers inclus. chaque fichier a le nombre de fonctions déclarées. certains fichiers ont des fonctions dupliquées dans d'autres fichiers. donc ce que je veux est d'obtenir la liste de toutes les fonctions du fichier spécifique puis mettre cette liste à l'intérieur d'un tableau, puis je vais utiliser array unique afin de supprimer les doublons. J'ai lu à propos de tokenizer mais je n'ai vraiment aucune idée de comment le faire saisir la fonction déclarée avec ses données. tout ce que j'ai est ceci:

function get_defined_functions_in_file($file) 
{ 
    $source = file_get_contents($file); 
    $tokens = token_get_all($source); 

    $functions = array(); 
    $nextStringIsFunc = false; 
    $inClass = false; 
    $bracesCount = 0; 

    foreach($tokens as $token) { 
     switch($token[0]) { 
      case T_CLASS: 
       $inClass = true; 
       break; 
      case T_FUNCTION: 
       if(!$inClass) $nextStringIsFunc = true; 
       break; 

      case T_STRING: 
       if($nextStringIsFunc) { 
        $nextStringIsFunc = false; 
        $functions[] = $token[1]; 
       } 
       break; 

      // Anonymous functions 
      case '(': 
      case ';': 
       $nextStringIsFunc = false; 
       break; 

      // Exclude Classes 
      case '{': 
       if($inClass) $bracesCount++; 
       break; 

      case '}': 
       if($inClass) { 
        $bracesCount--; 
        if($bracesCount === 0) $inClass = false; 
       } 
       break; 
     } 
    } 

    return $functions; 
} 

malheureusement, cette fonction répertorie uniquement les noms de fonction .. est ce que je dois à la liste toute fonction déclarée avec sa structure .. donc des idées?

merci d'avance ..

+0

Voulez-vous que le corps de la fonction, par exemple quand vous trouvez 'function foo() {return 'foo';}' vous voulez qu'il retourne 'return 'foo;''. Veuillez donner un exemple des résultats attendus. Et fournissez également plus de détails sur les raisons pour lesquelles vous en auriez besoin en premier lieu. – Gordon

+0

Je travaille sur un script appelé "includer". ceci utilisé pour analyser les fichiers php contient des instructions "include". nous lisons donc le chemin des inclusions et obtenons les données en utilisant file_get_contents. et les remettre dans le fichier principal. J'ai environ 100 fichiers inclus. chacun de ces fichiers a des fonctions. certaines de ces fonctions ont été re-déclarées dans d'autres fichiers. donc ce que je veux c'est obtenir la liste de toutes les fonctions de tous ces fichiers contient ces fonctions puis j'ai besoin de les mettre dans le tableau et finalement utiliser array_unique pour supprimer les doublons. si vous avez une meilleure solution s'il vous plaît éclairer moi .. merci, – ermac2014

Répondre

2

Si vous avez obtenu les noms de fonction de votre get_defined_functions, envisagez d'utiliser Reflection API pour le reste des travaux.

Exemple:

include 'file-with-functions.php'; 
$reflector = new ReflectionFunction('foo'); // foo() being a valid function 
$body = array_slice(
    file($reflector->getFileName()), // read in the file containing foo() 
    $reflector->getStartLine(), // start to extract where foo() begins 
    $reflector->getEndLine() - $reflector->getStartLine()); // offset 

echo implode($body); 

Comme @nunthrey suggested, vous pouvez également utiliser Zend_Reflection pour obtenir les deux: les fonctions dans un fichier et leur contenu. Exemple avec Zend_Reflection:

$reflector = new Zend_Reflection_File('file-with-functions.php'); 
foreach($reflector->getFunctions() as $fn) { 
    $function = new Zend_Reflection_Function($fn->name); 
    echo $function->getContents(); 
} 
+0

salut, merci pour les réponses vraiment appréciées .. pour le premier exemple que vous avez ajouté. Je ne peux pas utiliser include car le fichier que j'ai contient des fonctions dupliquées. donc quand je l'inclue dans le script principal, je reçois des erreurs de fonction déclarées en double. deuxième exemple, je reçois toujours cette erreur: « Erreur fatale: de Zend_Reflection_File 'not found classe » Je suis en utilisant php v5.2.6 dois-je ajouter des extensions pour faire ce travail? merci, – ermac2014

+0

@ ermac2014 'Zend_Reflection' est un composant de http://framework.zend.com/ - vous n'avez pas besoin d'une extension pour l'utiliser, mais vous devez télécharger le framework. – Gordon

+0

mais c'est le code php non? Je veux l'utiliser avec php .. – ermac2014

Questions connexes