PHP 学习之路:第二十五天——抽象类与接口

311 阅读2分钟

一、抽象类

接口里面的方法都是没有实现的,而类里面的方法都是有实现的. 有没有一种形态,允许类里面一部分方法不实现呢?

  • 当接口中的某些方法对于所有的实现类都是一样的实现方法,只有部分方法需要用到多态的特性
  • 如人和动物吃东西是不同的,但是呼吸是相同的,不需要为人和动物分别实现呼吸的功能
  • abstract关键字用于定义抽象类
  • 在抽象方法前面添加abstract关键字可以标明这个方法是抽象方法不需要具体实现{}
  • 抽象类中可以包含普通的方法,有方法的具体实现
  • 继承抽象类的关键字是extends
  • 继承抽象类的子类需要实现抽象类中定义的抽象方法
  • 抽象类不能被实例化,当子类继承抽象类的时候,所有的抽象的方法都必须定义

二、接口

2.1 对象接口

接口就是把不同类的共同行为进行定义,然后在不同的类里面实现不同的功能

  • interface定义接口,implements用于表示类实现某个接口
  • 接口里面的方法没有具体的实现,无{}
  • 实现了某个接口的类必须提供接口中定义的方法的具体实现
  • 不能实例化接口,但是能够判断某个对象是否实现了某个接口。instanceof关键字判断某个对象是否实现了某个接口 $object instanceof interface
  • 接口可以继承接口(interface extends interface
  • 接口中定义的所有方法都必须是公有,这是接口的特性

2.2 多态

因为接口的方法实现可以有很多,所以对于接口里面定义的方法的具体实现是多种多样的,这种特性我们称为多态

不需要知道对象属于哪个类,只要判断该对象的类是否实现接口,就能实现调用,相同代码实现不同结果

形象点说就是同一个接口,不同的对象实现,得出的结果不一样就是多态,如传入的是人类对象,得到的是人类吃苹果,传入的是猴子对象,得到的就是猴子吃香蕉。相同的一行代码,对于传入不同的接口的实现的对象的时候,表现是不同的。

三、单例对象

四、PHP面向对象的特殊实践

4.1 魔术方法之_toString()和invoke()

  • __toString()当对象被当作String使用时,这个方法会被自动调用(需要在类中定义__tostring()方法。调用 echo $object
  • __invoke()当对象被当作方法调用时,这个方法会被自动调用(需要在类中定义__invoke()方法)。调用 object(object(parameter)

4.2 魔术方法之__call()和__callStatic()

__call()方法:当对象访问不存在的方法名称时,此方法自动调用。

  • 调用示例:public function __call(name,name,argument){} 注意:访问控制关键字必须为public;必须有两个参数:对象访问的方法名称(name)、方法包含的参数(name)、方法包含的参数(argument ==> 自动转换成数组)。

__callStatic()方法:当对象访问不存在的静态方法名称时,此方法自动调用。

  • 调用示例:public static function __callStatic(name,name,argument){} 注意:同__call();此方法为静态方法(static)。

这两种方法也被称为方法的重载(overloading)

  • 注意区分重写(overwrite)
  • 通过这两个方法,同一个方法的调用可以对应不同的方法的实现(同一个方法的静态调用、动态调用对应不同的方法实现)

#总结

  • class: 类声明
  • new: 类实例化
  • public: 公开成员,随处可见
  • protected: 受保护成员,仅在当前类或子类中可见
  • private: 私有成员, 仅在当前类可见
  • spl_autoload_register(): 自动加载器
  • extends: 类的扩展
  • static: 声明类的静态成员
  • $this: 实例引用
  • self: 类的引用
  • trait: 类功能横向扩展