php抽象类,接口,特性的比较
php抽象类
- 抽象方法必须被子类继承实现,所以不能为私有,只能是受保护的或公有的;
- 抽象类子类的方法访问控制级别必须和抽象类相等或更宽松。例如,父类的抽象方法是受保护的,子类实现时则必须为受保护的或者公有的;
- 抽象方法的实现,必传参数的数量和类型必须严格一致;
- 抽象类的非抽象方法,子类可不实现,等同于普通类方法的继承;
- 抽象类中的抽象方法,只能定义,不能实现其方法体;
- 抽象类可定义常量,且可被子类覆盖;
接口
- 接口类可以通过extend继承一个或多个接口类,多个接口之间用逗号分隔,用以实现接口类的扩充;
- 接口类定义的方法必须声明为公有,因此子类的实现方法也只能为公有;
- 接口方法体必须为空;
- 接口类定义的常量和类常量私用方式一样,但不能被子类或者子接口覆盖;
- 普通类通过关键字implements来实现一个或多个接口;
- 继承多个接口,方法不能有重名;
- 普通类继承接口,必须实现接口类里面所有的方法,参数也和接口方法定义相同;
- 可加默认参数,这点和抽象类方法的实现基本一致;
特性
- 特性与普通类相似,有自己的方法,属性,但不能通过extends继承,也没有类常量;
- 特性的方法如果和当前类方法冲突,会被当前类的方法覆盖(优先级:当前类>特性类>基类);
- 一个类加载了多个特性,当多个特性中方法有重名时,需要在代码中通过关键字insteadof设置优先级或通过as关键字重命名处理,否则报错;
正因为来之不易,所以才有了后来的倍加珍惜。