クラスが定義されたPHPファイル(実行時)の検索


111

特定のクラス(または関数)が定義されたPHPファイルを見つけることができるPHPのリフレクション/イントロスペクション/マジックはありますか?

言い換えれば、私はPHPクラス、またはインスタンス化されたオブジェクトの名前を持っています。これを、クラスが定義されたファイルシステムパスを返すもの(関数、Reflectionクラスなど)に渡したいと思います。

/path/to/class/definition.php

get_included_files())これまでに含まれているすべてのファイルのリストを取得し、それらをすべて手動で解析するために)を使用できることはわかっていますが、これは1回の試行で多くのファイルシステムにアクセスできます。

また、この情報をどこかにキャッシュする__autoloadメカニズムにいくつかの追加コードを記述できることも理解しています。ただし、私が考えている状況では、既存の__autoloadを変更することは禁止されています。

これを行うことができる拡張機能について聞くのは興味深いでしょうが、私は最終的には「ストック」インストールで実行できるものを望んでいます。


2
Magentoがここに連れてきてくれました:-]
アラン

@alanでプロパティ名のスペルを確認できます。
アランストーム

回答:


225

試す ReflectionClass

例:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();

これはfalse、ネイティブクラスなどでファイル名が見つからない場合に返されます。


10

名前空間ファイルのReflectionClassの場合、次のように接頭辞「\」を追加してグローバルにします。

$ reflector = new \ ReflectionClass( 'FOO');

それ以外の場合は、定義されていない名前空間のReflectionClassでエラーが発生します。 上記の回答にはコメントする権利がなかったので、補足回答として書きました。


0

includeフォルダーがある場合、次のようにして「class $ className」の「grep」を実行するシェルスクリプトコマンドを実行できます$filename = ``grep -r "class $className" $includesFolder/*\。それにより、そのファイルが含まれていたファイルが返されます。それ以外には、魔法はないと思いますPHPがyaのためにそれを行うための関数。


3
ここでは正直で嫌いな人の好奇心。この回答が、私がすでに検討して拒否した考えよりも優れていると思われたのはなぜですか。「(get_included_files())を使用して、これまでに含まれているすべてのファイルのリストを取得し、それらをすべて手動で解析できることを理解していますが、これは1回の試行で多くのファイルシステムにアクセスできます。」
アランストーム

PHPでパーサーを書くのにかかる行数とは対照的に1行なので、grep関数はCでコンパイルされていると思います。おそらく何を書いた場合よりもはるかに高速です。
Seaux

ああ、わかった。私の実際の懸念は、これを行うために各ファイルに何度もディスクアクセスを繰り返すことでした(これは、私が構築しているツールで頻繁に発生することです)、次にそれをより明確にするために試みるコードの量ではありません時間。(参考:確認する必要があります。grepよりもはるかに優れています!)
Alan Storm

ackまたはawk?この単純な私はawkの、その実際に私のfavプログラミング言語を愛し、より多くの人が定期的にgrepを使用して...もののためにその「きれい」
Seaux

awkではありません。ackbetterthangrep.com 検索コードベースのプロジェクト用に最適化されたのは、perlのバックgrepの置き換えです。それは素晴らしい。
アランストーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.