2009-08-14 13 views
-1

私は、クラスが定義されたときに透過的にコードを実行する方法を探しています - もっと重要なのは、クラスが拡張されるときです。例えばクラス定義時にコードを実行する方法(オブジェクトインスタンス化ではない)

、私が持っている場合:

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

class B extends A 
{ 
} 

が、私はそれが "!Aが定義されています\ n" は印刷したいと思います。これは不可能ですか?

答えて

2

それは不可能ですね、そうです。クラス定義では何も呼び出されません。

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

あなたはFatal error: Constructor blah::__construct() cannot be staticになります。

2

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

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

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

:クラスBのコンストラクタをオーバーライドする場合

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

、Aのコンストラクタを呼び出すことはないだろう。例:Bは、多くの方法のうちの1つのインスタンスである場合、コードでただし

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

、あなたは確認することができます:それは多くを助けている場合

function doSomethingWithA(A $a).... 

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

は知ってはいけません。

+0

私がまだそのトラックにいなかったら、それは実際に役立つでしょう。ありがとう!私は必要なことをするための他の方法を模索しています。私はSqoolと呼ばれるデータベース抽象化レイヤーを構築しています。それは、ユーザーが単一のクラスを作成して使用することができて本当にうれしいです。問題は、誰かが少なくとも1つのオブジェクトを既にインスタンス化している場合、基礎となる「sqoolクラス」(テーブル)が存在することだけを知ることです。私がこれを解決することを計画している方法は、ユーザーがまだクラスを認識していない場合に呼び出すことができる関数(標準名)を作成させることです。興味がある方はhttp://tinyurl.com/o3tz2nをチェックしてください –

0

Javaでは、このはをJVMに登録する「Javaエージェント」を使用することで、可能なのはです。

関連する問題