-1

クラスが定義されているときにコードを透過的に実行する方法を探しています。さらに重要なのは、クラスが拡張されたときにです。

たとえば、私が持っている場合:

class A
{  function define()
   {  echo "A has been defined!\n";
   }
   __magicDefine
   {  define();
   }
}

class B extends A
{
}

「A が定義されました!\n」と表示させたいと思います。これは不可能ですか?

4

3 に答える 3

2

あなたがやろうとしているのは、実行中のオブジェクトを追跡することだと思いますか?あなたの最終目標がここにあるのか正確にはわかりません。

おそらく、実行時にReflectionClassを探していますか?クラスが存在するかどうか、および拡張クラスが何であるかを判別できます。

また、あなたが目指しているのは、使用されているオブジェクトを追跡するオブジェクトファクトリのようです。それらのシングルトン、ファクトリ、および静的メンバー関数/変数の概念を調べてください。

これに関して:

class A 
{ 
 public function __construct()
 { print "A has been called";
 } 
}

クラスBがコンストラクターをオーバーライドする場合、Aのコンストラクターは呼び出されません。元:

class B extends A
{
 public function __construct()
 { print "B has been called";
   // parent::__construct(); /// would print out A has been called
 }
}

ただし、コードでは、次のいずれかの方法でBがAのインスタンスであるかどうかを確認できます。

function doSomethingWithA(A $a)....

function doSmoethingWithA($a)
{
 if($a instanceof A)
 {
  // blah
 }
}

それが大いに役立つかどうかわからない。

于 2009-08-14T20:30:17.467 に答える
2

無理でしょうね、うん。クラス定義では何も呼び出されません。

この概念は、積極的にサポートされていません。書いてみてください

class foo {
    static function __construct() {
        echo "hi!";
    }
}

そしてあなたは得るでしょうFatal error: Constructor blah::__construct() cannot be static

于 2009-08-14T20:22:41.790 に答える
0

Java では、JVMに登録する「Java エージェント」を使用することで、これが可能になります。java.lang.instrument.ClassFileTransformer

于 2009-08-15T19:35:16.120 に答える