2011-10-29 23 views
22

次のコードでは、PHPが不自由なので、customMethod()はprivateです。これはなぜですか?可視性は、何かが定義されているのではなく、宣言されている場所によって決まりますか?抽象的なプライベート関数

テンプレートクラスの定型的なコードにしかcustomMethodを表示しないようにして、それが上書きされないようにしたいのであれば、代わりに保護され、最終的になりますか?

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を選択できるようにすることができます。保護された抽象関数は、派生クラスが保護された実装を呼び出してカプセル化を中断するpublic関数を自由に作成できるので、これと同じ保証を与えることはできません。 – Aaron

+0

回避策:抽象クラス定義(つまり、 'final protected function my_function()')の 'protected'関数に' final'キーワードを追加することができます。これにより、関数が子クラスによってオーバーライドされるのを防ぐことができますが、子クラスは自身の関数を呼び出すことができます(親のprivate関数では起こり得ないもの)。これが抽象クラスを定義する目的を破るか否かは、別の日の哲学的議論である。 (あるいは、抽象クラスを拡張して関数を個人的に定義する新しいクラスを定義することもできます)。 – Slicktrick

1

抽象メソッドのは、パブリックまたは保護されています。これは必須です。

関連する問題