第十二节:PHP子类重写父类方法

Last Updated on

子类重写父类方法,是面向对象编程中的一种语言特性,方法重写允许子类或子类提供已由其一个超类或父类提供的方法的特定实现。在PHP类的继承和受保护的作用域中,我们谈到了类的继承。现在我们创建了一个简单的几乎没有任何代码的Administrator类来扩展User类。现在我们继续介绍子类如何从父类继承属性和方法,以及如何从子类隐藏父类的属性和方法。因为有时候父类的方法与子类的方法要做的事情有些不同,这就是这节课讲的内容,子类重写父类的方法。

子类重写父类方法-实例演示

子类重写父类方法实例演示

子类重写父类方法-实例演示

打开app/user.php,找到login方法,我们想要administrator也能够登录,我们要所有的管理员登录,现在我们添加一些小功能在我们的登陆方法让user登陆功能跟子类administrator登录功能进行区分:

首先让我们把administrator子类的login方法写得详细一点,在这里返回来的确实一个用户,这个新功能是为administrator做的,回到administrator.php,把getlogin的方法删除,删除use Jiexi\Library\User,把User.php的login方法复制到Administrator.php:

回到index.php输出User类登陆方法……记录管理员最后登陆的时间,正式我们想要的结果。

子类重写父类方法-认识代码异味

认识代码异味

子类重写父类方法-认识代码异味

但不知道你发现里面的问题了吗?在我们的Administrator类,’user登陆 …’这返回来的信息是来自parent类的,这就显得代码异味了,在程序开发领域,代码中的任何可能导致深层次问题的症状都可以叫做代码异味

  1. 代码重复: 相同或者相似的代码存在于一个以上的地方;
  2. 长方法: 一个非常长的方法、函数或者过程;
  3. 巨类: 一个非常庞大的类;
  4. 太多的参数: 函数或者过程的冗长的参数列表使得代码可读性和质量非常差;
  5. 特性依恋: 一个类过度的使用另一个类的方法;
  6. 亲密关系: 一个类依赖另一个类的实现细节;
  7. 拒绝继承: 子类以一种‘拒绝’的态度,覆盖基类中的方法,换句话说,子类不想继承父类中的方法,参考里氏替换原则;
  8. 冗余类/寄生虫: 一个功能太少的类;
  9. 人为的复杂: 在简单设计已经满足需求的时候,强迫使用极度复杂的设计模式;
  10. 超长标识符: 尤其,在软件工程中,应该毫无保留的使用命名规则来消除歧义;
  11. 超短标识符: 除非很明显,一个变量名应该反映它的功用;
  12. 过度使用字面值: 为提高可读性和避免编码错误,应该使用命名常量。此外,字面值可以且应该在可能的情况下,独立存放于资源文件或者脚本中,在软件部署到不同区域时,可以很方便的本地化。

幸运的是,我们可以改进Administrator.php的login方法:

现在,当我们调用Administrator登陆时首先调用父类的登陆方法,然后父类方法附加到Administrator的登陆逻辑,当你调用父类的方法,记住要使用两个冒号!让我们看的更加清楚,把父类方法返回值存到message变量,然后在返回到Administrator登陆的逻辑:

让我们回到index.php输出记录管理员最后登陆的时间,工作非常棒正式我们想要的。
下载本节课完整源码

Last modified: 2019年1月21日

前一篇

PHP面向对象编程基础

第十一节:PHP类的继承和受保护的作用域

PHP类的继承:熟知的一个程序设计特性PHP对象模型也使用继承,在OOP中,我们可以用一个类并从中创建一个子类.

...

后一篇

PHP面向对象编程基础

第十三节:PHP抽象类

PHP抽象类:抽象类不能被实例化一个抽象类是只能作为父类的类,所以当你想强迫开发者扩展这个类时,可以使用这种类,而不是直接使用它.

...