2009-08-14 29 views
-1

我正在尋找一種在類定義時透明地運行代碼的方法 - 更重要的是,當類被擴展時。如何在類定義上運行代碼(不是對象實例化)

舉例來說,如果我有:

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

class B extends A 
{ 
} 

我想,要打印 「!A已經被定義\ n」。這是不可能的嗎?

回答

2

這是不可能的,是的。沒有什麼會被調用類定義。

這個概念甚至是一種積極的不支持;嘗試寫

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

,你會得到Fatal error: Constructor blah::__construct() cannot be static

2

我想你要做的是跟蹤正在運行的對象?不完全確定你的最終目標是在這裏。

也許您在運行時正在尋找ReflectionClass?您可以確定一個類是否存在以及擴展類是什麼。

這聽起來像是你想要的是一個對象工廠,跟蹤正在使用的對象。查找單身人士,工廠和靜態成員函數/變量的概念。

至於這樣的:

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

如果B類覆蓋的構造,它不會調用構造函數。例如:

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

然而,在代碼中,你可以檢查,如果B是的許多方面之一的實例:

function doSomethingWithA(A $a).... 

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

不知道有沒有什麼幫助了。

+0

如果我不在那條賽道上,那實際上會有所幫助。謝謝!我正在探索其他做我需要的方式。我正在構建一個名爲Sqool的數據庫抽象層,它對於用戶能夠創建一個類然後使用它非常好。問題是我只知道一個底層的「sqool類」(表)存在,如果有人已經實例化至少一個對象。我打算解決這個問題的方式是讓用戶創建一個函數(帶有標準名稱),如果我還沒有意識到該類,我可以調用它。如果你有興趣查看http://tinyurl.com/o3tz2n – 2009-08-14 21:51:03

0

在Java中,這個可能是通過使用「java代理」,它將註冊一個java.lang.instrument.ClassFileTransformer與JVM。

相關問題