次のコードでは、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();
..
抽象メソッドは、定義上、派生クラスによって実装する必要があるため、プライベートにすることはできません。 public
にしたくない場合は、protected
にする必要があります。つまり、派生クラスでは表示できますが、他のユーザーは表示できません。
PHP抽象クラスのマニュアル は、このようにprotected
を使用する例を示しています。
抽象メソッドはパブリックまたは保護されています。これは必須です。
customMethod
がCustomA
クラスの外部で呼び出されることを恐れている場合は、CustomA
クラスをfinal
にすることができます。
abstract class Template{
abstract protected function customMethod();
public function commonMethod() {
$this->customMethod();
}
}
final class CustomA extends Template {
protected function customMethod() {
}
}
PHPの子クラスでプライベートなものは、親クラスには表示されません。親クラスでプライベートなものは、子クラスには表示されません。
PHPで抽象メソッドを使用する場合、可視性は子クラスから親クラスまで流れる必要があることに注意してください。このシナリオで可視性private
をPHPで使用すると、CustomA::customMethod
がCustomA
内に完全にカプセル化されます。唯一のオプションはpublic
です。またはprotected
可視性。
抽象クラスTemplate
のインスタンスを作成できないため、クライアントコードからのプライバシーが維持されます。 final
キーワードを使用して将来のクラスがCustomA
を拡張しないようにする場合、解決策があります。ただし、CustomA
を拡張する必要がある場合は、当面はPHPの動作方法を理解する必要があります。