Come scoprire dove è definita una funzione?


109

Come posso sapere in quale file e riga è stata definita una determinata funzione?

Risposte:


231

Puoi anche farlo in PHP stesso:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();

8
Suggerimento: $reflFunc->isInternal() === TRUEsignifica che -> getFileName () e -> getStartLine () restituirà FALSE.
Bob Stein

Questo funziona ancora bene per me. Vorrei scegliere come target il punto in cui la funzione viene attivata, anziché da dove viene definita.
EHerman

2
@ EHerman Non penso che tu possa trovare chiamanti di una funzione con la riflessione. Se potessi, probabilmente non funzionerebbe bene per questo perché i file PHP tendono ad essere inclusi su richiesta, e quindi probabilmente non avresti caricato tutto il codice che chiama la funzione.
Tom Haigh

11
Per i metodi di classe puoi usare$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay

3
@EHerman potresti esaminare debug_backtrace () per trovare dove viene chiamata una funzione.
dotVezz

12

O usa un IDE che permetta di farlo (consiglierei Eclipse PDT), oppure puoi sempre grep se su Linux, o usando wingrep. In Linux sarebbe qualcosa del tipo:

grep -R "function funName" *

dalla cartella principale del progetto.


5
meglio avere: grep -R "function \ sfunName" *
David

3

Se usi un IDE come Netbeans, puoi CTRL + Fare clic sull'uso della funzione e ti porterà dove è definito, supponendo che il file si trovi all'interno della cartella del progetto che hai definito.

Tuttavia, non esiste un codice o una funzione per farlo.


Lo stesso in Zend Studio e presumo che funzionerà anche con PDT per Eclipse.
Gordon

@Gordon "un IDE come" Penso che questo sia un must per qualsiasi IDE moderno ...
feeela

2

Presumo che per "descritto" si intenda "definito". Per questo, idealmente hai bisogno di un IDE decente che possa farlo.


Sto usando Aptana che ha la ricerca di testo attraverso il progetto. Ma per usarlo ho bisogno di importare il sito buco (molto grande) come progetto.
SaltLake

2

Ecco una funzione di base che scansionerà i tuoi interi file di progetto per una stringa specifica e ti dirà in quale file si trova e in quale posizione di caratteri inizia usando solo php di base. Spero che questo aiuti qualcuno ...

<?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;
}
?>

2

un altro modo per verificare da dove viene la funzione definita, prova a ridefinire la funzione, il sistema di errore PHP restituirà semplicemente un errore che ti dice dove si trova la funzione definita in precedenza


1

Mi piace la soluzione di Tom, quindi ho pensato di poter condividere un po 'più di trucchi con ReflectionFunction (dovrebbe funzionare su ogni PHP 5):

  • una riga per stampare il nome del file:

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

Tieni presente che non ti mostrerà la posizione per le funzioni interne (come _ ), ma può comunque stampare l'API per esso come di seguito.

  • per stampare la definizione ed i parametri della funzione:

    print new ReflectionFunction("foo");

    Esempio:

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

0

Avrai bisogno di un IDE che supporti la funzionalità "Open Function Declaration". Un buon per php è Eclipse PDT.

Per cercare la definizione della funzione, evidenziare il nome della funzione, tenere premuto CTRL + Fare clic sul nome.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.