Bir fonksiyonun nerede tanımlandığını nasıl öğrenebilirim?


110

Belirli bir fonksiyonun hangi dosya ve satırda tanımlandığını nasıl öğrenebilirim?

Yanıtlar:


232

Bunu PHP'nin kendisinde de yapabilirsiniz:

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

8
İpucu: $reflFunc->isInternal() === TRUE-> getFileName () ve -> getStartLine () FALSE döndürecektir.
Bob Stein

Bu hala benim için iyi çalışıyor. Tanımlandığı yerden değil, işlevin çalıştırıldığı yeri hedeflemek istiyorum.
EHerman

2
@EHerman Yansımalı bir fonksiyonun arayanlarını bulacağınızı sanmıyorum. Eğer yapabilseydiniz, muhtemelen bunun için iyi çalışmazdı, çünkü PHP dosyaları talep üzerine dahil edilme eğilimindedir ve bu nedenle, büyük olasılıkla işlevi çağıran tüm kodun yüklenmiş olmasına sahip olmayacaksınız.
Tom Haigh

11
Sınıf yöntemleri için kullanabilirsiniz$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay

3
@EHerman, bir işlevin nerede çağrıldığını bulmak için debug_backtrace () 'e bakabilirsiniz.
dotVezz

12

Ya buna izin veren bir IDE kullanın (Eclipse PDT'yi tavsiye ederim) ya da Linux'taysa ya da wingrep kullanarak her zaman grep edebilirsiniz. Linux'ta şöyle bir şey olurdu:

grep -R "function funName" *

projenin kök klasöründen.


5
sahip olmak daha iyi: grep -R "function \ sfunName" *
David

3

Netbeans gibi bir IDE kullanırsanız, CTRL + Kullan işlevine tıklayabilirsiniz ve dosyanın tanımladığınız proje klasörü içinde olduğunu varsayarak sizi tanımlandığı yere götürecektir.

Yine de bunu yapacak bir kod veya işlev yok.


Zend Studio'da da aynı ve bunun Eclipse için PDT ile de çalışacağını varsayıyorum.
Gordon

@Gordon Bunun için olması gerekir düşünüyorum "gibi bir IDE" herhangi modern IDE ...
feeela

2

Sanırım "tanımlanmış" derken "tanımlanmış" demek istiyorsunuz. Bunun için ideal olarak bunu yapabilecek iyi bir IDE'ye ihtiyacınız var.


Proje üzerinden metin araması olan Aptana kullanıyorum. Ancak onu kullanmak için delik (çok büyük) sitesini bir proje olarak içe aktarmam gerekiyor.
SaltLake

2

Bu, tüm proje dosyalarınızı belirli bir dizge için tarayan ve size hangi dosyada olduğunu ve yalnızca temel php kullanarak hangi karakter konumunda başladığını söyleyen temel bir işlevdir . Umarım bu birine yardımcı olur ...

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

İşlevin nerede tanımlandığını kontrol etmenin başka bir yolu, işlevi yeniden tanımlamaya çalışın, PHP hata sistemi basitçe işlevin daha önce tanımlandığı yerde size söylenen bir hata verir


1

Tom'un çözümünü beğendim, bu yüzden ReflectionFunction ile biraz daha fazla numara paylaşabileceğimi düşündüm (her PHP 5'te çalışmalı):

  • dosya adını yazdırmak için tek satırlık:

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

Lütfen size dahili işlevlerin konumunu göstermeyeceğini unutmayın ( _ gibi ), ancak yine de aşağıdaki gibi API'yi yazdırabilir.

  • işlevin tanımını ve parametrelerini yazdırmak için:

    print new ReflectionFunction("foo");

    Misal:

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

0

"Açık İşlev Bildirimi" işlevini destekleyen bir IDE'ye ihtiyacınız olacak. Php için iyi olanlardan biri Eclipse PDT'dir.

İşlev tanımını aramak için, işlev adını vurgulayın, CTRL tuşunu basılı tutun + İsme tıklayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.