视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php类方法重写原则有哪些
2020-11-02 18:46:33 责编:小采
文档

PHP类方法重写规则:

(推荐教程:php教程)

1、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()
 {
 //子类继承父类重写父类方法时访问级别只能更加宽松 不可更为严格
 }
}

2、PHP是否重写父类方法只会根据方法名是否一致判断(5.3以后重写父类方法参数个数必须一致)

这里并不是说方法参数无任何作用,PHP无重载机制,所以判断是不是重写只会通过方法名(C/C++不仅要方法名相同,参数也相同时才被视为重写,否则即为重载,即新定义了一个多态函数的态)。

当方法名相同时,即被认为是在重写父类方法,5.2可以参数不同,5.3以后参数需和父类方法一致,且都追寻继承访问级别的规则。

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仍然会被视为对父类方法的重写,会受到继承访问权限的升降规则
 }
}

3、重写时访问级别只可以等于或者宽松于父类,不可提升访问级别

父类的public方法不能被子类重写为protected或者private,protected方法不能被重写为private。

class Father
{
 public function index()
 {
 }
}

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

下载本文
显示全文
专题