面向对象编程(OOP)是一种程序设计范式,它将程序结构化为由数据和行为组成的对象。PHP 支持面向对象编程,这使得代码更加模块化、易于维护和重用。在这一章中,我们将深入探讨 PHP 中的 OOP 概念及其应用。

1. 类与对象

类的定义与实例化

类是对象的蓝图,定义了对象的属性和方法。对象是类的实例,通过类来创建。

  1. <?php
  2. class Car {
  3. public $color;
  4. public $model;
  5. public function __construct($color, $model) {
  6. $this->color = $color;
  7. $this->model = $model;
  8. }
  9. public function message() {
  10. return "My car is a " . $this->color . " " . $this->model . ".";
  11. }
  12. }
  13. $myCar = new Car("red", "Toyota");
  14. echo $myCar->message();
  15. ?>

在上面的示例中,我们定义了一个 Car 类,并通过 Car 类创建了一个对象 $myCar。构造函数 __construct 用于初始化对象的属性。

类的属性与方法

属性是对象的变量,方法是对象的函数。我们可以通过类定义属性与方法。

  1. <?php
  2. class Person {
  3. public $name;
  4. public $age;
  5. public function __construct($name, $age) {
  6. $this->name = $name;
  7. $this->age = $age;
  8. }
  9. public function introduce() {
  10. return "Hi, I'm " . $this->name . " and I'm " . $this->age . " years old.";
  11. }
  12. }
  13. $person1 = new Person("Alice", 25);
  14. echo $person1->introduce();
  15. ?>

构造函数与析构函数

构造函数 __construct 在对象创建时调用,用于初始化对象。析构函数 __destruct 在对象销毁时调用,用于清理资源。

  1. <?php
  2. class Test {
  3. public function __construct() {
  4. echo "Constructor called\n";
  5. }
  6. public function __destruct() {
  7. echo "Destructor called\n";
  8. }
  9. }
  10. $testObj = new Test();
  11. ?>

2. 继承与多态

继承的基本概念

继承是面向对象编程的一个重要特性,允许我们创建一个新类,该类继承自已存在的类。新类称为子类,已存在的类称为父类。子类继承父类的属性和方法,并可以添加新的属性和方法。

  1. <?php
  2. class Animal {
  3. public $name;
  4. public function __construct($name) {
  5. $this->name = $name;
  6. }
  7. public function makeSound() {
  8. return "Some generic sound";
  9. }
  10. }
  11. class Dog extends Animal {
  12. public function makeSound() {
  13. return "Bark";
  14. }
  15. }
  16. $dog = new Dog("Buddy");
  17. echo $dog->makeSound(); // 输出:Bark
  18. ?>

方法重写与多态

子类可以重写父类的方法,以提供特定的实现。这种重写机制称为多态。

  1. <?php
  2. class Cat extends Animal {
  3. public function makeSound() {
  4. return "Meow";
  5. }
  6. }
  7. $cat = new Cat("Whiskers");
  8. echo $cat->makeSound(); // 输出:Meow
  9. ?>

使用 parent 关键字

子类可以使用 parent 关键字调用父类的方法。

  1. <?php
  2. class Bird extends Animal {
  3. public function makeSound() {
  4. return parent::makeSound() . " but specifically chirp";
  5. }
  6. }
  7. $bird = new Bird("Tweety");
  8. echo $bird->makeSound(); // 输出:Some generic sound but specifically chirp
  9. ?>

3. 接口与抽象类

接口的定义与实现

接口定义了一组方法,这些方法必须由实现接口的类来定义。接口不能包含具体的实现。

  1. <?php
  2. interface Shape {
  3. public function area();
  4. }
  5. class Circle implements Shape {
  6. private $radius;
  7. public function __construct($radius) {
  8. $this->radius = $radius;
  9. }
  10. public function area() {
  11. return pi() * $this->radius * $this->radius;
  12. }
  13. }
  14. $circle = new Circle(5);
  15. echo $circle->area(); // 输出:78.539816339745
  16. ?>

抽象类的定义与使用

抽象类是一种不能被实例化的类,它可以包含具体的实现和抽象的方法。抽象方法必须在子类中实现。

  1. <?php
  2. abstract class Vehicle {
  3. abstract public function startEngine();
  4. public function honk() {
  5. return "Honking!";
  6. }
  7. }
  8. class Motorbike extends Vehicle {
  9. public function startEngine() {
  10. return "Motorbike engine started";
  11. }
  12. }
  13. $bike = new Motorbike();
  14. echo $bike->startEngine(); // 输出:Motorbike engine started
  15. echo $bike->honk(); // 输出:Honking!
  16. ?>