web-dev-qa-db-ja.com

クラスが定義されたPHPファイル(実行時)を見つける

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

言い換えると、PHPクラス、またはインスタンス化されたオブジェクトの名前があります。これをsomething(関数、リフレクションクラスなど)に渡したいと思います。クラスが定義されたファイルシステムパスを返します。

_/path/to/class/definition.php
_

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

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

これを行うことができる拡張機能を聞くのは面白いでしょうが、最終的には「ストック」インストールで実行できるものが欲しいです。

99
Alan Storm

ReflectionClassを試してください

例:

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

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

208
Gordon

namespacedファイルのReflectionClassの場合、次のようにプレフィックス「\」を追加してグローバルにします。

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

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

8
Jevin

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

0
Seaux