PHP类方法重写原则

可能咱们平常工做中不多用到这块知识点,但我仍是喜欢把遇到的却不清楚的知识点摸清php

PHP的类方法重写规则ide

一、final修饰的类方法不可被子类重写

final修饰的类方法不可被子类重写 即使final private方法没法被继承 子类仍不能对齐进行重写函数

class FinalMethod
{
    //可继承不可重写
    final public function finalPublic()
    {
        echo "can be inherited, but be overrided";
    }
    //可继承不可重写
    final protected function finalProtected()
    {
        echo "can be inherited, but be overrided";
    }
    //不可继承不可重写 虽然子类继承不到父类的private方法 但同时也会被final限制没法重写
    final private function finalPrivate()
    {
        echo "can not be inherited or be overrided";
    }
    //虽然不可继承 但子类里可重写此方法
    private function private()
    {
        echo "can not be inherited ,but be overrided";
    }
}

class Override extends FinalMethod
{
    //error
    public function finalPublic()
    { 
    }
    //error
    protected function finalProtected()
    {
    }
    //error
    private function finalPrivate()
    {
    }
    //correct
    public/protected/private function private()
    {
        //子类继承父类重写父类方法时访问级别只能更加宽松 不可更为严格
    }
}
二、PHP是否重写父类方法只会根据方法名是否一致判断(5.3之后重写父类方法参数个数必须一致)

这里并非说方法参数无任何做用 PHP无重载机制 因此判断是否是重写只会经过方法名(C/C++不只要方法名相同,参数也相同时才被视为重写,不然即为重载,即新定义了一个多态函数的态) 当方法名相同时即被认为是在重写父类方法,5.2能够参数不一样,5.3之后参数需和父类方法一致,且都追寻继承访问级别的规则。spa

class Father
{
    public function index($args_1)
    {
    }
}

class Child extends Father
{
    //5.3之后重写方法必须与父类保持参数个数相同
    public function index($args_1, $args_2)
    {
        //在C/C++中此为重载非重写,由于C/C++具备标准的多态机制,会因参数不一样而视为某一方法的另外一种态
        //but在php中此依然为重写 但5.3之后此为非法 必须与父类的方法参数个数保持一致
    }
    //5.3之后重写方法必须与父类保持参数个数相同
    private function index($args_1, $args_2)
    {
        //C/C++会由于参数不一样于父类方法而视为重载,即新定义了一个函数的态,因此不会受到继承访问权限的限制
        //但php仍然会被视为对父类方法的重写,会受到继承访问权限的升降规则限制
    }
}
三、重写时访问级别只能够等于或者宽松于父类 不可提高访问级别

父类的public方法不能被子类重写为protected或者private,protected方法不能被重写为private,能够宽松er,不能够严格ercode

class Father
{
    public function index()
    {
    }
}

class Child extends Father
{
    protected/private function index()
    {
       //访问权限提高 错误 
       //父类为public 则子类重写也只能为public
       //父类为protected 则子类可为public/protected
       //父类为private 则子类public/protected/private皆可
    }
}

其实关于访问级别继承规则有不少有趣的地方orm

private在咱们常识中是没法被继承的,子类拿不到,但其访问级别已经是最高,因此你在子类中能够写成private protected public 仿佛是咱们本身从新定义了一个函数同样,这点在5.2版本以前尤为突出,由于5.2以前的版本在继承重写父类方法是能够不保持参数个数相同,但5.3之后增强了这方面的限制,参数个数必须与父类相同继承

注:接口

    子类实现父类的抽象方法或某类实现接口的方法时其实仍属于继承关系,仍追寻访问等级只能下降不可提高的规则
it

    并且io

           抽象方法不可被声明为private,abstract修饰的方法确定是用于继承实现的,因此只能是public或者protected

           接口的方法声明必须为public,interface里声明的方法也确定是被继承实现的,且只能是public,                                       implements               此接口的类也指定重写成public类型的方法

相关文章
相关标签/搜索