面向对象的三大特征:继承、封装、多态。
封装(Encapsulation)
- 封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
- 封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
- 封装是将数据(属性)和操作数据的方法(方法)封装在一个单一的单元(类)中的概念。它通过限制对类的属性和方法的访问,以实现数据隐藏和保护。
在 PHP 中,可以使用访问修饰符(public、protected 和 private)来控制类的成员的访问权限。
class Car {
private $brand;
private $model;
public function __construct($brand, $model) {
$this->brand = $brand;
$this->model = $model;
}
public function getInfo() {
return "This is a {$this->brand} {$this->model}.";
}
}
$car = new Car("Toyota", "Corolla");
echo $car->brand; // 这里会报错,因为 $brand 是私有属性,无法直接访问
继承(Inheritance)
- 继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 继承是一种通过使用已存在的类(称为基类或父类)来创建新类(称为派生类或子类)的机制。子类继承了父类的属性和方法,并且可以拥有自己的属性和方法。
在 PHP 中,使用关键字 extends 来实现继承。
class Vehicle {
protected $brand;
public function __construct($brand) {
$this->brand = $brand;
}
public function getInfo() {
return "This is a {$this->brand}.";
}
}
class Car extends Vehicle {
private $model;
public function __construct($brand, $model) {
parent::__construct($brand);
$this->model = $model;
}
public function getCarInfo() {
return "This is a {$this->brand} {$this->model}.";
}
}
$car = new Car("Toyota", "Corolla");
echo $car->getInfo(); // 输出:This is a Toyota.
echo $car->getCarInfo(); // 输出:This is a Toyota Corolla.
多态(Polymorphism)
- 多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。
- 多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
- 多态是指同一类对象调用同一方法但产生不同的结果。
多态的优点:
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件:
- 继承
- 重写(子类继承父类后对父类方法进行重新定义)
- 父类引用指向子类对象
多态其实是在继承的基础上的。
在 PHP 中,多态通常通过方法重写(Override)来实现。子类可以重写父类中的方法,以适应自己的需求。
class Shape {
public function draw() {
return "Drawing a shape.";
}
}
class Circle extends Shape {
public function draw() {
return "Drawing a circle.";
}
}
class Rectangle extends Shape {
public function draw() {
return "Drawing a rectangle.";
}
}
$shape1 = new Circle();
$shape2 = new Rectangle();
echo $shape1->draw(); // 输出:Drawing a circle.
echo $shape2->draw(); // 输出:Drawing a rectangle.
# Circle 和 Rectangle 类继承自 Shape 类,并重写了 draw() 方法。当调用 draw() 方法时,根据对象的类型,会调用相应类中的方法,产生不同的结果。这就是多态的概念。
文章评论