2012-02-24 21 views
6

我在PHP OOP手冊http://www.php.net/manual/en/language.oop5.visibility.php看到這個,爲什麼輸出不是我不能讓我的周圍頭:富:: testPrivate富:: testPublicPHP手冊OOP知名度的例子 - 有人可以解釋它

class Bar 
{ 
    public function test() { 
     $this->testPrivate(); 
     $this->testPublic(); 
    } 

    public function testPublic() { 
     echo "Bar::testPublic\n"; 
    } 

    private function testPrivate() { 
     echo "Bar::testPrivate\n"; 
    } 
} 

class Foo extends Bar 
{ 
    public function testPublic() { 
     echo "Foo::testPublic\n"; 
    } 

    private function testPrivate() { 
     echo "Foo::testPrivate\n"; 
    } 
} 

$myFoo = new foo(); 
$myFoo->test(); // Bar::testPrivate 
       // Foo::testPublic 
+1

提示:如果將'private'更改爲'protected',您將獲得所需的輸出。閱讀有關訪問修飾符。 – 2012-02-24 15:59:11

+0

檢查這個線程。第一個答案幫助了我很多。 http://stackoverflow.com/questions/12794290/php-manual-visibilty-example-confused – Sam 2013-03-06 05:31:03

+0

檢查此線程。第一個答案幫助了我很多。 http://stackoverflow.com/questions/12794290/php-manual-visibilty-example-confused – Sam 2013-03-06 05:32:09

回答

11

這是關於變量/方法的可見性。

您會注意到在Bar課程中,方法testPrivate()private。這意味着只有它自己可以訪問該方法。沒有孩子。

所以當Foo延伸Bar,然後要求運行test()方法,做了兩兩件事:

  1. 它覆蓋testPublic()的方法,因爲它是公開的,Foo有它自己覆蓋的權利版。
  2. 它叫test()Bar(因爲test()只存在於Bar())。

testPrivate()覆蓋,是保存test()類的一部分。因此,打印了Bar::testPrivate
testPublic()重寫,並且是繼承類的一部分。因此,打印了Foo::testPublic

+0

沒錯。感謝@rockerest的一個乾淨的解釋。 – 2012-02-24 16:06:12

+0

但是,如果您從'Foo:testPublic'內部echo $ this-> testPrivate()',它將回顯'Foo :: testPrivate'。所以它看起來像從這個上下文調用時被覆蓋。現在我很困惑! – bfavaretto 2012-02-24 16:08:01

+0

@bfavaretto請記住,'$ this'是一個動態變量,它引用了代碼所在的類。所以當它處理'test()'時,'$ this'引用Bar類的臨時副本(給你'Bar :: testPrivate()'),但'Foo'類中的'$ this'將引用'Foo'類(給你'Foo :: testPrivate()')。 – rockerest 2012-02-24 16:09:59

1

在某些情況下,很容易發現你想要的酒吧私人方法,但你也希望美孚類來訪問它。
但是,等等,它是公共還是私人?
這裏是保護修飾符。
當方法是私有,只有類本身可以調用該方法。
當一種方法是public,每個人都可以稱它爲自由派對。
當一個方法是保護,類本身可以調用它,並且任何插入此方法的人(子)都可以將其稱爲它們自己的方法。

-1

我幾天前發佈了同樣的問題......因爲這種行爲對我來說也不合邏輯。 $這總是指它使用的當前對象。在我看來,像這樣的例子應該拋出一個錯誤或警告或其他東西。因爲在上面的例子中,你實際上正在訪問私有成員:SSS所支持的是不可用的!

+1

不是一個建設性的答案。你可以用建設性的東西留下評論,而不是咆哮。 – 2013-06-04 13:46:00