0

この質問は、クラスが定義された PHP ファイルの検索 (実行時) に似ています。

オブジェクトが定義されているファイルを見つけることができます:

$reflector = new ReflectionClass(get_class($object));
echo $reflector->getFileName();

ただし、メソッドを見つける必要があります。たとえば、 $object->method() は /var/www/html/object.php 行 201 で定義されています

4

1 に答える 1

1

私の最初の推測は、phpファイルを読んで、宣言が正規表現を使用している行を見つけることです:

function getLineWhereMethodIsDefined($object, $method_name) {
    $class_name = get_class($object);
    $reflector = new ReflectionClass($class_name);
    $file_name = $reflector->getFileName();
    foreach (file($file_name) as $i => $line) {
        if (preg_match("'function\s+ " . $method_name . "\('s")) {
            $text = $class_name."::".$method_name."()";
            $text .= " is defined in ".$file_name." on line ".($i + 1);
            return $text;
        }
    }
    return false;
}

file()これは、ファイル全体をメモリに読み込むため、メモリ使用量が改善される可能性があるためwhile(false !== gets()) { }、解析するファイルが大きい場合は、メモリの効率が大幅に向上します。

注: ReflectionClassのドキュメントによると、クラス内のメソッドについて取得できる情報はReflectionMethodオブジェクトだけであり、メソッドが宣言されている場所に関する情報はありません。したがって、上記の解決策が唯一の方法のようです。

于 2012-11-16T17:40:39.760 に答える