Comment savoir où une fonction est définie?

109

Comment puis-je savoir dans quel fichier et quelle ligne une fonction donnée a été définie?

Lac salé
la source

Réponses:

231

Vous pouvez également le faire en PHP lui-même:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
Tom Haigh
la source
8
Astuce: $reflFunc->isInternal() === TRUEsignifie -> getFileName () et -> getStartLine () renverra FALSE.
Bob Stein
Cela fonctionne toujours bien pour moi. Je voudrais cibler l'endroit où la fonction est déclenchée, au lieu de l'endroit où elle est définie.
EHerman
2
@EHerman Je ne pense pas que vous puissiez trouver des appelants d'une fonction avec réflexion. Si vous le pouviez, cela ne fonctionnerait probablement pas bien car les fichiers PHP ont tendance à être inclus à la demande, et vous n'auriez donc probablement pas tout le code chargé qui appelle la fonction.
Tom Haigh
11
Pour les méthodes de classe, vous pouvez utiliser$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay
3
@EHerman vous pouvez regarder dans debug_backtrace () pour trouver où une fonction est appelée.
dotVezz
12

Utilisez soit un IDE qui le permet (je recommanderais Eclipse PDT), soit vous pouvez toujours le grep si sur Linux, ou en utilisant wingrep. Sous Linux, ce serait quelque chose comme:

grep -R "function funName" *

depuis le dossier racine du projet.

Johnco
la source
5
mieux d'avoir: grep -R "function \ sfunName" *
David
3

Si vous utilisez un IDE comme Netbeans, vous pouvez CTRL + Cliquez sur la fonction utilisée et elle vous mènera à l'endroit où elle est définie, en supposant que le fichier se trouve dans le dossier de projet que vous avez défini.

Il n'y a cependant pas de code ou de fonction pour faire cela.

Stephen Melrose
la source
Même chose dans Zend Studio et je suppose que cela fonctionnera également avec PDT pour Eclipse.
Gordon
@Gordon "un IDE comme" Je pense que c'est un must pour tout IDE moderne…
feeela
2

Je suppose que par «décrit», vous voulez dire «défini». Pour cela, vous avez idéalement besoin d'un IDE décent qui peut le faire.

Anton Gogolev
la source
J'utilise Aptana qui a une recherche de texte dans le projet. Mais pour l'utiliser, je dois importer le site du trou (très grand) en tant que projet.
SaltLake
2

Voici une fonction de base qui analysera l' ensemble de vos fichiers de projet pour une chaîne spécifique et vous indiquera dans quel fichier il se trouve et à quelle position de caractère il commence en utilisant uniquement le php de base. J'espère que cela aide quelqu'un ...

<?php 
$find="somefunction()";

echo findString('./ProjectFolderOrPath/',$find);

function findString($path,$find){
    $return='';
    ob_start();
    if ($handle = opendir($path)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if(is_dir($path.'/'.$file)){
                    $sub=findString($path.'/'.$file,$find);
                    if(isset($sub)){
                        echo $sub.PHP_EOL;
                    }
                }else{
                    $ext=substr(strtolower($file),-3);
                    if($ext=='php'){
                        $filesource=file_get_contents($path.'/'.$file);
                        $pos = strpos($filesource, $find);
                        if ($pos === false) {
                            continue;
                        } else {
                            echo "The string '$find' was found in the file '$path/$file and exists at position $pos<br />";
                        }
                    }else{
                        continue;
                    }
                }
            }
        }
        closedir($handle);
    }
    $return = ob_get_contents();
    ob_end_clean();
    return $return;
}
?>
Lawrence Cherone
la source
2

une autre façon de vérifier où est la fonction définie, essayez de redéfinir la fonction, le système d'erreur PHP retournera simplement une erreur vous indiquant où la fonction précédemment définie

Yohanip
la source
1

J'aime la solution de Tom, alors j'ai pensé que je pourrais partager un peu plus d'astuces avec ReflectionFunction (cela devrait fonctionner sur chaque PHP 5):

  • une ligne pour imprimer le nom de fichier:

    print (new ReflectionFunction("foo"))->getFileName();

Veuillez noter qu'il ne vous montrera pas l'emplacement des fonctions internes (telles que _ ), mais il peut toujours imprimer l'API comme ci-dessous.

  • pour imprimer la définition et les paramètres de la fonction:

    print new ReflectionFunction("foo");

    Exemple:

    $ php -r 'print new ReflectionFunction("_");'
    Function [ <internal:gettext> function _ ] {
      - Parameters [1] {
        Parameter #0 [ <required> $msgid ]
      }
    }
Kenorb
la source
0

Vous aurez besoin d'un IDE prenant en charge la fonctionnalité «Open Function Declaration». Un bon pour php est Eclipse PDT.

Pour rechercher la définition de la fonction, mettez en surbrillance le nom de la fonction, maintenez CTRL + Cliquez sur le nom.

Yada
la source