PHP 方法覆盖override 与 抽象方法的实现之间的关系

Overload重载:重载是多态的基础,是方法名相同但根据参数不一样作不一样的处理,PHP是弱类型语言,不能直观的实现方法重载ide

Override覆盖:覆盖是子类继承父类方法并对齐进行从新构造,方法名相同即视为覆盖,且PHP5.3之后要求参数必须同父类相同,5.2之前能够不一样函数

覆盖spa

可否覆盖由final关键字决定,final方法即为不可覆盖方法,但同时受父类的访问权限限制,覆盖方法访问权限不可高于父类code

实现对象

实现基于继承,将父类中的抽象方法(没有函数体的函数声明)的方法功能实现出来,父类并无此方法的功能,子类必须有权限拿到才能去实现方法功能(函数体),因此实现父类的抽象方法必须可访问到,父类抽象方法不可为private继承

一、父类某方法可否被子类重写与此方法的访问级别无关接口

public protected private对某方法内否被重写没有影响,可否被重写要看此方法是否被final修饰(final类不可被继承,final方法不可被重写)io

二、但重写方法要受到访问级别的限制,即访问权限不可提高规定function

(不单单是PHP,其余面向对象语言依然适用),访问权限只能够下降,不能够提高。class

三、PHP重写父类方法时须要保持参数一致

虽然在 PHP 5.2 及之前没有此限制但咱们仍是以最高标准为原则,这也是风险控制的良好习惯,PHP并不会像C/C++同样在子类与父类方法名相同参数不一致时认为是对此方法的 多态重载,PHP没有直接的重载机制,因此必须保持方法名相同参数相同

四、重写不等于  实现  

实现是抽方法声明或者接口方法声明实现的场景,实现是继承关系,继承某抽象类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均可以
    }
}
相关文章
相关标签/搜索