2013-02-28 37 views
2

我試圖寫下面的代碼在PHP要求作出澄清關於PHP OOP程序

class A { 
protected static $comment = "I am A" ; 
public static function getComment() { 
    return self :: $comment; 
} 
} 

class B extends A { 
protected static $comment = "I am B" ; 
} 

echo B::getComment() ; // echoes "I am A" 

難道不應該返回I am B?在oop中PHP不會覆蓋父項嗎?感謝您的澄清。

== ==編輯

而且我的問題是有什麼區別,然後靜態和實例之間,因爲例如它的工作原理:

class A { 
    protected $comment = "I am A" ; 

    public function getComment() { 
     return $this -> comment ; 
    } 
} 

class B extends A { 
    protected $comment = "I am B" ; 
} 

$B=new B ; 

echo $B->getComment(); 
+1

看看這篇文章: [http://stackoverflow.com/questions/4280001/protected-static-member-variables] [1] [1]:http://stackoverflow.com/questions/4280001/protected-static-member-va riables – 2013-02-28 11:50:59

+0

太棒了!我不知道那個晚期的靜態綁定的東西 - 這真的很有用:) – user28490 2013-02-28 11:56:31

回答

3

您正在查找的功能稱爲「延遲靜態綁定」,並且是documented here

簡短的說法是,爲了使靜態變量以您希望的方式工作,您需要使用static::而不是self::

注意:這隻適用於PHP 5.3及更高版本。

+0

謝謝先生我只要我非常小的聲望允許我這樣做,就會接受你的答案:) – user28490 2013-02-28 11:55:18

1

是的,它覆蓋它,但你的情況你沒有覆蓋的parent class.

getComment方法,如果你嘗試

class B extends A { 
protected static $comment = "I am B" ; 
public static function getComment() { 
    return self :: $comment; 
} 
} 

然後它會顯示I am B

你在做什麼,實際上是調用的b classgetComment方法是不存在的child class所以冒泡parent class方法和顯示結果。

+0

但是爲什麼它在實例上下文中工作,例如: class A { \t protected $ comment =「I am A」; \t public function getComment(){ \t \t return $ this - > comment; \t} } class B extends A { \t protected $ comment =「I am B」; } $ B = new B; echo $ B-> getComment(); // echo我是B – user28490 2013-02-28 11:51:58

+0

@ user28490試試吧,它不會顯示我是B – 2013-02-28 11:55:06

+0

帕爾馬斯感謝您的澄清,現在有意義 – user28490 2013-02-28 11:57:53

0

你需要使用晚期靜態綁定

class A { 
protected static $comment = "I am A" ; 
public static function getComment() { 
    return static :: $comment; 
} 
} 

class B extends A { 
protected static $comment = "I am B" ; 
} 

echo B::getComment() ; // echoes "I am A" 

我希望這一定意義