7

PHPファイルへのパスを保持する単一の引数を受け取り、指定されたファイルを解析して次のようなものを返す関数を作成したいと思います:

class NameOfTheClass
   function Method1($arg1, $arg2, $arg2)
   private function Method2($arg1, $arg2, $arg2)
   public function Method2($arg1, $arg2, $arg2)

abstract class AnotherClass
   function Method1($arg1, $arg2, $arg2)
   private function Method2($arg1, $arg2, $arg2)
   public function Method2($arg1, $arg2, $arg2)

function SomeFunction($arg1, $arg2, $arg3)

この関数は、指定されたファイルに存在するすべてのクラス、メソッド、および関数を、定義されたすべての識別子 (abstract、public、private、protected、static、extend、interfaces など) とともに返す必要があります。

私の最初の考えは、これを行うために正規表現を使用することでしたが、これらはコメントで非常にうまく動作しません。

別の可能な解決策は、次の組み込み PHP 関数を使用することでした。

get_declared_classes
get_declared_interfaces
get_defined_functions
get_class_methods

ただし、これらの関数では、クラス/メソッド/関数が定義されているファイルを表示できないため、あまり役に立ちません。

Tokenizer 拡張機能が私の問題の解決策であると信じていますが、この拡張機能を使用したことはありません。

4

3 に答える 3

10

PHP 5 を使用している場合は、Reflection APIがツールになります。

例:

$class = new ReflectionClass("NameOfTheClass");
$methods = $class->getMethods();
foreach($methods as $m) {
    print $m->name;
    $m->isPrivate() ? print "Private" : print "";
    $m->isPublic() ? print "Public" : print "";
    $params = $m->getParameters();
    foreach($params as $p) {
        print $p->getName();
        }
}
于 2009-09-12T12:14:28.813 に答える
2

お気づきのように、正規表現はこの仕事に適したツールではありません ^^

そして、あなたが言ったように、あなたが提案した組み込み関数もそれほど役に立ちません-役立つかもしれない唯一のことは、どのクラスが存在するかを知ることができるということです...しかし、それらは組み込みクラスも返します:-(

トークナイザー拡張機能の使用は、私には少しやり過ぎ/難しいようです。実際、私はおそらくそのようには行かないでしょう。「低レベル」すぎると思います。


代わりに、PHP のReflection API を見てみましょう。これは、クラス、インターフェイス、関数などをリバース エンジニアリングするために存在します。

ですから、あなたがやろうとしていることには非常に適していると思います。


編集:ここに簡単な例があります:

まず、クラスでリフレクションを実行してみましょう:

include dirname(__FILE__) . '/temp-2.php';
$rC = new ReflectionClass('MyFirstClass');

これで、それが宣言されたファイルとその中にあるメソッドを見つけることができます:

var_dump($rC->getFileName());
var_dump($rC->getMethods());

どちらがあなたを得るでしょう:

string '/home/squale/developpement/tests/temp/temp-2.php' (length=48)

array
  0 => &
    object(ReflectionMethod)[2]
      public 'name' => string '__construct' (length=11)
      public 'class' => string 'MyFirstClass' (length=12)
  1 => &
    object(ReflectionMethod)[3]
      public 'name' => string 'glop' (length=4)
      public 'class' => string 'MyFirstClass' (length=12)


そして今、各メソッドに関する情報を取得するには:

foreach ($rC->getMethods() as $rM) {
    var_dump($rM, $rM->getParameters());
    echo '-----';
}

あなたが得るでしょう:

object(ReflectionMethod)[3]
  public 'name' => string '__construct' (length=11)
  public 'class' => string 'MyFirstClass' (length=12)

array
  0 => &
    object(ReflectionParameter)[4]
      public 'name' => string 'arg1' (length=4)
  1 => &
    object(ReflectionParameter)[5]
      public 'name' => string 'arg2' (length=4)

-----

object(ReflectionMethod)[2]
  public 'name' => string 'glop' (length=4)
  public 'class' => string 'MyFirstClass' (length=12)

array
  0 => &
    object(ReflectionParameter)[5]
      public 'name' => string 'a' (length=1)


そこから、もう少し掘り下げることができるはずです。そして、あなたが最初に尋ねたことにたどり着きます;-)


補足として:私が知らないことが1つあります:「特定のファイルで宣言されているクラス/メソッドを見つける方法」:-(

誰かアイデアがあれば、大歓迎です!

于 2009-09-12T12:03:26.787 に答える
2

次の手順をお勧めします。

  1. get_declared_classesと の現在の出力を保存しget_declared_interfacesますget_defined_functions(本当にそれらをサポートする必要がある場合)
  2. ファイルを含める
  3. get_declared_classesget_declared_interfacesおよび get_defined_functionsを保存したものと比較して、何が新しいかを確認します
  4. リフレクションを使用してそれらを分析する
  5. 次のファイルの手順 2 に進みます
于 2009-09-12T12:19:41.627 に答える