封装
将客观事物抽象为逻辑实体,实体的属性和功能相结合,形成一个有机的整体,并对实体的属性和功能实现进行访问控制。外部通过开放的接口访问,无需知道实现细节
好处:隔离变化、提高复用性、提高安全性
例如:
限定特定属性为 private 或 protected,并对外提供 setter 和 getter 方法进行设置和读取,外部使用者无需知道类内部保存数据的方式和格式
针对某个属性只提供 getter 方法,那么这个属性对外部来说就是只读属性
可以在 setter 方法中添加限制,让外部的调用者不能把垃圾数据放入对象当中
继承
子类通过继承的方式可以使用基类的所有功能,并作出自己的改变或扩展。
继承的实现方式有两类:
实现继承是指直接使用基类的属性和方法而无需额外编码的能力
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
多态
多态也称为“类切换”,是指在一个共通接口后面维护多种实现(如果代码中存在许多条件分支语句,可能就需要多态出场了)。
同一操作作用于不同的类的实例,将产生不同的执行结果,即不同类的对象收到相同的消息时,得到不同的结果。
PHP
中虽然可以实现多态,但和 c++
还有 Java
这些面向对象的语言相比,多态性并不是那么突出,因为 PHP
本身就是一种弱类型的语言,不存在父类对象转化为子类对象或者是子类对象转化为父类对象的问题,所以多态的应用并不是那么的明显
<?php
//定义员工接口
interface Employee
{
//定义员工工作,需要在子类的实现
public function working();
}
//定义打字员类
class Typist implements Employee
{
public function working()
{
var_dump('打字员正在打字');
}
}
//定义经理类
class Manager implements Employee
{
public function working()
{
var_dump('经理正在开会');
}
}
class Runner
{
/**
* @param string $employee
* @return Employee
* @throws Exception
*/
public static function getInstance(string $employee) : Employee
{
$employee = ucfirst($employee);
if (!class_exists($employee)) {
throw new Exception('employee not exists');
}
if (!is_a($employee, 'Employee', true)) {
throw new Exception('employee error');
}
return new $employee;
}
}
class Runner2
{
public function working(Employee $employee)
{
$employee->working();
}
}
//两种多态的形式
try {
//类的内部实例化
Runner::getInstance('typist')->working();
//类的外部实例化
(new Runner2())->working(new Manager());
} catch (Exception $e) {
var_dump($e);
}