Bagaimana cara mengetahui di mana fungsi didefinisikan?

109

Bagaimana saya bisa mengetahui di file dan baris mana fungsi tertentu didefinisikan?

Danau garam
sumber

Jawaban:

231

Anda juga bisa melakukan ini di PHP itu sendiri:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
Tom Haigh
sumber
8
Tip: $reflFunc->isInternal() === TRUEmeans -> getFileName () dan -> getStartLine () akan mengembalikan FALSE.
Bob Stein
Ini masih bekerja dengan baik untuk saya. Saya ingin menargetkan tempat fungsi dijalankan, alih-alih dari tempat ia didefinisikan.
EHerman
2
@EHerman Saya rasa Anda tidak dapat menemukan pemanggil fungsi dengan refleksi. Jika Anda bisa, mungkin itu tidak akan berfungsi dengan baik untuk ini karena file PHP cenderung disertakan sesuai permintaan, dan Anda mungkin tidak memiliki semua kode yang dimuat yang memanggil fungsi tersebut.
Tom Haigh
11
Untuk metode Kelas, Anda dapat menggunakan$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay
3
@EHerman Anda bisa melihat debug_backtrace () untuk menemukan di mana sebuah fungsi dipanggil.
dotVezz
12

Gunakan IDE yang memungkinkan melakukannya (saya akan merekomendasikan Eclipse PDT), atau Anda selalu dapat grep jika di Linux, atau menggunakan wingrep. Di Linux akan menjadi seperti ini:

grep -R "function funName" *

dari dalam folder root proyek.

Johnco
sumber
5
lebih baik memiliki: grep -R "function \ sfunName" *
David
3

Jika Anda menggunakan IDE seperti Netbeans, Anda dapat CTRL + Klik fungsi yang digunakan dan ini akan membawa Anda ke tempat yang ditentukan, dengan asumsi file tersebut berada dalam folder proyek yang Anda tentukan.

Tidak ada kode atau fungsi untuk melakukan ini.

Stephen Melrose
sumber
Sama di Zend Studio dan saya berasumsi ini akan bekerja dengan PDT untuk Eclipse juga.
Gordon
@Gordon "sebuah IDE seperti" Saya rasa ini harus dimiliki untuk setiap IDE modern…
feeela
2

Saya berasumsi bahwa dengan "menggambarkan" yang Anda maksud adalah "didefinisikan". Untuk ini, idealnya Anda membutuhkan IDE yang layak yang dapat melakukannya.

Anton Gogolev
sumber
Saya menggunakan Aptana yang memiliki pencarian teks melalui proyek. Tetapi untuk menggunakannya saya perlu mengimpor situs lubang (sangat besar) sebagai proyek.
SaltLake
2

Inilah fungsi dasar yang akan memindai seluruh file proyek Anda untuk string tertentu dan memberi tahu Anda file mana itu dan posisi karakter mana yang dimulai hanya dengan menggunakan php dasar. Semoga ini membantu seseorang ...

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

cara lain untuk memeriksa di mana fungsi itu didefinisikan, cobalah untuk mendefinisikan kembali fungsi tersebut, sistem kesalahan PHP hanya akan mengembalikan kesalahan yang memberi tahu Anda di mana fungsi tersebut didefinisikan sebelumnya

Yohanip
sumber
1

Saya suka solusi Tom, jadi saya pikir saya bisa membagikan lebih banyak trik dengan ReflectionFunction (ini harus berfungsi pada setiap PHP 5):

  • satu baris untuk mencetak nama file:

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

Harap dicatat bahwa ini tidak akan menunjukkan lokasi untuk fungsi internal (seperti _ ), tetapi masih dapat mencetak API untuk itu seperti di bawah ini.

  • untuk mencetak definisi dan parameter fungsi:

    print new ReflectionFunction("foo");

    Contoh:

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

Anda memerlukan IDE yang mendukung fungsionalitas "Open Function Declaration". Yang bagus untuk php adalah Eclipse PDT.

Untuk mencari definisi fungsi, sorot nama fungsi, tahan CTRL + Klik pada namanya.

Yada
sumber