一、抽象类
接口里面的方法都是没有实现的,而类里面的方法都是有实现的. 有没有一种形态,允许类里面一部分方法不实现呢?
- 当接口中的某些方法对于所有的实现类都是一样的实现方法,只有部分方法需要用到多态的特性
- 如人和动物吃东西是不同的,但是呼吸是相同的,不需要为人和动物分别实现呼吸的功能
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()方法)。调用 parameter)
4.2 魔术方法之__call()和__callStatic()
__call()方法:当对象访问不存在的方法名称时,此方法自动调用。
- 调用示例:public function __call(argument){} 注意:访问控制关键字必须为public;必须有两个参数:对象访问的方法名称(argument ==> 自动转换成数组)。
__callStatic()方法:当对象访问不存在的静态方法名称时,此方法自动调用。
- 调用示例:public static function __callStatic(argument){} 注意:同__call();此方法为静态方法(static)。
这两种方法也被称为方法的重载(overloading)
- 注意区分重写(overwrite)
- 通过这两个方法,同一个方法的调用可以对应不同的方法的实现(同一个方法的静态调用、动态调用对应不同的方法实现)
#总结
- class: 类声明
- new: 类实例化
- public: 公开成员,随处可见
- protected: 受保护成员,仅在当前类或子类中可见
- private: 私有成员, 仅在当前类可见
- spl_autoload_register(): 自动加载器
- extends: 类的扩展
- static: 声明类的静态成员
- $this: 实例引用
- self: 类的引用
- trait: 类功能横向扩展