PHPメソッドオーバーライドoverrideと抽象メソッドの実装の関係

2787 ワード

Overloadリロード:リロードはマルチステートの基礎であり、メソッド名は同じであるがパラメータによって異なる処理を行い、PHPは弱いタイプの言語であり、直感的にメソッドリロードを実現することはできない
Overrideオーバーライド:オーバーライドは、子が親メソッドを継承し、整列して再構築され、メソッド名が同じであるオーバーライドとみなされ、PHP 5.3以降の要求パラメータは親と同じでなければならない.5.2以前は異なることができる.
オーバーライド(Override)
上書きできるかどうかはfinalキーワードで決まります.finalメソッドは上書き不可メソッドですが、親のアクセス権によって制限されます.上書きメソッドのアクセス権は親より高くありません.
導入
実装は継承に基づいて、親クラスの抽象メソッド(関数体の関数宣言がない)のメソッド機能を実装します.親クラスにはこのメソッドの機能はありません.子クラスにはメソッド機能(関数体)を実装する権限が必要です.したがって、親クラスを実装する抽象メソッドにはアクセスできます.親クラスの抽象メソッドはprivateではありません.
1、親メソッドがこのメソッドのアクセスレベルに関係なく、クラスに上書きされるかどうか
public protected privateは、あるメソッド内で書き換えられるかどうかは影響しません.書き換えられるかどうかは、このメソッドがfinal修飾されているかどうかによって決まります(finalクラスは継承できません.finalメソッドは書き換えられません).
2.ただし、書き換え方法はアクセスレベルの制限を受けなければならない.すなわち、アクセス権限が向上できない規定である.
(PHPだけでなく、他のオブジェクト向け言語も適用されます)、アクセス権は下げるだけで、上げることはできません.
3、PHPが親メソッドを書き換える時、パラメータを一致させる必要がある
PHP 5.2以前はこの制限はありませんでしたが、最高基準を原則としています.これもリスクコントロールの良い習慣です.PHPはC/C++のように子類と親類の方法名が同じパラメータが一致しない場合にこの方法の多態重荷だとは思いません.PHPには直接的な重荷機構がないので、方法名が同じパラメータであることを維持しなければなりません.
4、書き換えが実現に等しくない
実装は抽象メソッド宣言またはインタフェースメソッド宣言実装のシーンであり、実装は継承関係であり、ある抽象クラスorインタフェースを継承してそのメソッドを実装し、アクセス権限の制約を受ける
書き換えはアクセスする必要はありません.書き換えは遠くに立って子の中で親のある方法を見て自分の方法をして、触れる必要はありません.実装は異なり、実装は継承に属し、アクセスする必要があります.これは抽象的な方法がprivateと宣言されてはいけません.インタフェースが特殊で、publicでなければならない理由です.
抽象クラスの抽象メソッドやインタフェースのインタフェースメソッドと混同しないでください.抽象メソッドとインタフェースのメソッドはすべてメソッド宣言です.私たちはサブクラスがこの抽象クラスやインタフェースに継承されて実装します.これは継承関係です.あなたは私にあげて、私は実装することができます.だから抽象メソッドはprivateで修飾することはできません.そうしないと、サブクラスは取得できません.抽象的な方法はまた布団類の継承を実現しなければならず、デッドロックになった.
abstract class Abstract
{
    //       public protected                
    //                               (    )
    
    abstract public function abstractPublicFunc();
    abstract protected function abstractProtectedFunc();
}

class Test extends Abstract
{
    public function abstractPublicFunc()
    {
        //         public       public
    }
    
    public/protected function abstractProtectedFunc()
    {
        //         protected       private    protected private
    }
}
class Father
{
    public function publicFunc()
    {
        //      public
    }
    
    portected function protectedFunc()
    {
        //    public/protected
    }
    
    private function privateFunc($args_1,$args_2....,$args_n)
    {
        //    public/protected/private
    }
}

class Child
{
    public function publicFunc()
    {
        //            public
    }
    
    public/portected function protectedFunc()
    {
        //           public/protected
    }
    //                             private          
    public/portected/private function privateFunc($args_1,$args_2....,$args_n)
    {
        //private            public/protected/private   
    }
}