Wie finde ich heraus, wo eine Funktion definiert ist?

109

Wie kann ich herausfinden, in welcher Datei und Zeile eine bestimmte Funktion definiert wurde?

SaltLake
quelle

Antworten:

231

Sie können dies auch in PHP selbst tun:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
Tom Haigh
quelle
8
Tipp: $reflFunc->isInternal() === TRUEbedeutet, dass -> getFileName () und -> getStartLine () FALSE zurückgeben.
Bob Stein
Das funktioniert bei mir immer noch gut. Ich möchte zielen, wo die Funktion ausgelöst wird, anstatt von dort, wo sie definiert wird.
EHerman
2
@EHerman Ich glaube nicht, dass Sie Anrufer einer Funktion mit Reflexion finden können. Wenn Sie könnten, würde es wahrscheinlich nicht gut funktionieren, da PHP-Dateien in der Regel bei Bedarf enthalten sind und Sie wahrscheinlich nicht den gesamten Code geladen haben, der die Funktion aufruft.
Tom Haigh
11
Für Klassenmethoden können Sie verwenden$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay
3
@EHerman Sie können in debug_backtrace () nachsehen, wo eine Funktion aufgerufen wird.
dotVezz
12

Verwenden Sie entweder eine IDE, die dies ermöglicht (ich würde Eclipse PDT empfehlen), oder Sie können sie immer unter Linux oder mit Wingrep abrufen. Unter Linux wäre es ungefähr so:

grep -R "function funName" *

aus dem Stammordner des Projekts.

Johnco
quelle
5
besser zu haben: grep -R "function \ sfunName" *
David
3

Wenn Sie eine IDE wie Netbeans verwenden, können Sie STRG + Klicken Sie auf die verwendete Funktion. Sie gelangen dorthin, wo sie definiert ist, vorausgesetzt, die Datei befindet sich in dem von Ihnen definierten Projektordner.

Es gibt jedoch keinen Code oder keine Funktion, um dies zu tun.

Stephen Melrose
quelle
Dasselbe gilt für Zend Studio und ich gehe davon aus, dass dies dann auch mit PDT für Eclipse funktioniert.
Gordon
@ Gordon "eine IDE wie" Ich denke, dies ist ein Muss für jede moderne IDE ...
Feeela
2

Ich gehe davon aus, dass Sie mit "beschrieben" "definiert" meinen. Dafür benötigen Sie idealerweise eine anständige IDE, die dies kann.

Anton Gogolev
quelle
Ich benutze Aptana, die Textsuche durch Projekt haben. Aber um es zu benutzen, muss ich die ganze (sehr große) Site als Projekt importieren.
SaltLake
2

Hier ist eine grundlegende Funktion, die Ihre gesamten Projektdateien nach einer bestimmten Zeichenfolge durchsucht und Ihnen mitteilt, in welcher Datei sie sich befindet und an welcher Zeichenposition sie beginnt, indem sie nur einfaches PHP verwendet. Hoffe das hilft jemandem ...

<?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
quelle
2

Wenn Sie überprüfen möchten, wo die Funktion definiert ist, versuchen Sie, die Funktion neu zu definieren. Das PHP-Fehlersystem gibt einfach einen Fehler zurück, der Ihnen mitteilt, wo die Funktion zuvor definiert wurde

Yohanip
quelle
1

Ich mag Toms Lösung, also dachte ich, ich könnte ein bisschen mehr Tricks mit ReflectionFunction teilen (es sollte auf jedem PHP 5 funktionieren):

  • Einzeiler zum Drucken des Dateinamens:

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

Bitte beachten Sie, dass der Speicherort für interne Funktionen (z. B. _ ) nicht angezeigt wird, die API jedoch wie folgt gedruckt werden kann.

  • So drucken Sie die Definition und die Parameter der Funktion:

    print new ReflectionFunction("foo");

    Beispiel:

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

Sie benötigen eine IDE, die die Funktion "Open Function Declaration" unterstützt. Ein gutes für für PHP ist Eclipse PDT.

Um nach der Funktionsdefinition zu suchen, markieren Sie den Funktionsnamen, halten Sie STRG + Klicken Sie auf den Namen.

Yada
quelle