我有很好的oop理解,但在php中對其實現的理解很差...PHP5靜態方法的繼承。超載。獲取所謂的類名
我有以下代碼,希望它的自我記錄=)。
我需要有BB
輸出
class A{
// I can't copy function::classname() to all my descendant classes
static function classname(){
echo __CLASS__;
}
}
class B extends A{
static function test(){
self::classname();
}
function test1(){
self::classname();
}
//i have A LOT of static and non-static functions using self::classname() in their code
// I can't copy all them to base class
}
$v = new B();
B::test();
$v->test1();
我堅持用static::
和self::
語法
PS:另一種瘋狂的問題我遇到:
假設我有
function doSomething(){
echo $this->id;
}
有時會進入靜態環境。是的,我知道,那是因爲我的糟糕的應用程序設計。但是它可能建立一個第二(反射鏡,超載)函數
static function doSomething(){
echo false;
}
這意味着使用 $obj->doSomething()
返回id
和使用Class::doSomething()
返回false
問題3:
是它可能在靜態上下文中獲取屬性默認值自動在非靜態上下文中獲取屬性值?
本例沒有輸出'AA'? – Dan 2011-02-26 06:15:17
我的不好,更新了這個問題。你需要使用遲到的靜態綁定。 – xzyfer 2011-02-26 06:24:37
如果你想在classname()中得到被調用的類而不在子中再次實現它,你可以將它從'echo__CLASS__;'改爲'echo get_called_class();'(像LSB一樣需要PHP> = 5.3.0) – 2011-02-26 06:29:27