2011-10-29 75 views
22

下面的代碼將讓PHP不高興customMethod()是私有的。爲什麼會這樣?能見度是由什麼地方被宣佈而不是被定義的決定的?抽象私有函數

如果我想讓customMethod只對Template類中的樣板代碼可見,並防止它被覆蓋,我是否可以將它保護並最終?

的template.php:

abstract class Template() { 
    abstract private function customMethod(); 

    public function commonMethod() { 
     $this->customMethod(); 
    } 
} 

CustomA.php:

class CustomA extends Template { 
    private function customMethod() { 
     blah... 
    } 
} 

Main.php

... 
$object = new CustomA(); 
$object->commonMethod(); 
.. 

回答

41

抽象方法不能是私有的,因爲根據定義,它們必須由派生類來實現。如果你不希望它是public,它需要是protected,這意味着它可以被派生類看到,但沒有其他人看到。

The PHP manual on abstract classes向您展示以這種方式使用protected的示例。

+9

這與C++(我認爲Java)的行爲有何不同。 C++允許純虛函數(它們相當於抽象函數)是私有的。這很好,因爲它允許派生類指定和控制要做什麼,同時強制只有基類可以選擇WHEN來做。受保護的抽象函數不能爲您提供相同的保證,因爲派生類可以自由創建一個調用受保護實現並破壞封裝的公共函數。 – Aaron

+0

解決方法:您可以在抽象類定義(即'final protected function my_function()')中將'final'關鍵字添加到受保護的函數中。這將阻止函數被子類覆蓋,儘管子類可以爲自己調用函數(父類的私有函數不能發生的事情)。這是否會破壞定義抽象類的目的是另一天的哲學討論。 (或者,您可以定義一個新的類來擴展抽象類並在那裏私下定義函數。) – Slicktrick

1

摘要方法是公開的或受保護的。這是必須的。