関数が定義されている場所を見つける方法は?


109

特定の関数が定義されているファイルと行を確認するにはどうすればよいですか?

回答:


231

PHP自体でこれを行うこともできます。

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

8
ヒント:$reflFunc->isInternal() === TRUE-> getFileName()および-> getStartLine()はFALSEを返します。
ボブスタイン

これはまだ私にはうまくいきます。関数が定義されている場所からではなく、関数が実行されている場所をターゲットにしたいと思います。
EHerman 2014年

2
@EHermanリフレクションのある関数の呼び出し元を見つけることができないと思います。PHPファイルはオンデマンドでインクルードされる傾向があるため、これがうまく機能しない可能性があります。そのため、関数を呼び出すすべてのコードがロードされていない可能性があります。
トムヘイ2014年

11
使用できるクラスメソッド$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay 2014

3
@EHermanでは、関数が呼び出されている場所を見つけるためにdebug_backtrace()を調べることができます。
dotVezz

12

それを可能にするIDE(Eclipse PDTをお勧めします)を使用するか、Linuxの場合は常にgrepするか、wingrepを使用します。Linuxでは次のようになります。

grep -R "function funName" *

プロジェクトのルートフォルダ内から。


5
お勧め:grep -R "function \ sfunName" *
David

3

NetbeansのようなIDEを使用している場合は、CTRL +クリックして関数を使用すると、定義したプロジェクトフォルダー内にファイルがあると想定して、定義された場所に移動します。

ただし、これを行うためのコードや関数はありません。


Zend Studioでも同じですが、これはPDT for Eclipseでも機能すると思います。
ゴードン

@ゴードンは「IDEのような」私はこれがすべての現代のIDEのためになくてはならないことだと思います…
feeela

2

「記述されている」とは「定義された」という意味だと思います。このためには、理想的には、それを実行できるまともなIDEが必要です。


プロジェクト全体でテキスト検索を行うAptanaを使用しています。しかし、それを使用するには、穴(非常に大きい)サイトをプロジェクトとしてインポートする必要があります。
SaltLake 2010

2

これは、プロジェクトファイル全体をスキャンして特定の文字列を探し、基本的なphpのみを使用して、どのファイルにあり、どの文字位置から開始するかを通知する基本的な関数です。これが誰かを助けることを願っています...

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

関数がどこで定義されているかを確認する別の方法、関数を再定義してみてください


1

トムのソリューションが好きなので、ReflectionFunctionでもう少しトリックを共有できると思いました(すべてのPHP 5で動作するはずです)。

  • ファイル名を出力するワンライナー:

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

内部関数(_など)の場所は表示されませんが、以下のようにAPIを印刷できます。

  • 関数の定義とパラメータを出力するには:

    print new ReflectionFunction("foo");

    例:

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

0

「Open Function Declaration」機能をサポートするIDEが必要です。phpに適したのはEclipse PDTです。

関数定義を探すには、関数名を強調表示し、Ctrlキーを押しながら名前をクリックします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.