web-dev-qa-db-ja.com

抽象プライベート関数

次のコードでは、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();
..
28
jontyc

抽象メソッドは、定義上、派生クラスによって実装する必要があるため、プライベートにすることはできません。 publicにしたくない場合は、protectedにする必要があります。つまり、派生クラスでは表示できますが、他のユーザーは表示できません。

PHP抽象クラスのマニュアル は、このようにprotectedを使用する例を示しています。

45
Tesserex

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

2
fperet

customMethodCustomAクラスの外部で呼び出されることを恐れている場合は、CustomAクラスをfinalにすることができます。

abstract class Template{
    abstract protected function customMethod();

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

final class CustomA extends Template {
    protected function customMethod() {

    }
}
1
nikksan

PHPの子クラスでプライベートなものは、親クラスには表示されません。親クラスでプライベートなものは、子クラスには表示されません。

PHPで抽象メソッドを使用する場合、可視性は子クラスから親クラスまで流れる必要があることに注意してください。このシナリオで可視性privateをPHPで使用すると、CustomA::customMethodCustomA内に完全にカプセル化されます。唯一のオプションはpublicです。またはprotected可視性。

抽象クラスTemplateのインスタンスを作成できないため、クライアントコードからのプライバシーが維持されます。 finalキーワードを使用して将来のクラスがCustomAを拡張しないようにする場合、解決策があります。ただし、CustomAを拡張する必要がある場合は、当面はPHPの動作方法を理解する必要があります。

0