PHP面向对象编程(OOP)概念及示例
⚡ 智能摘要
PHP 中的面向对象编程 (OOP) 使用类和对象,围绕现实世界的对象构建应用程序模型。本教程将解释封装、继承和多态这三大 OOP 原则,以及 PHP 如何支持这些原则,并逐步构建可运行的类、继承和接口示例。

什么是 OOP?
面向对象编程是一种软件开发方法,它围绕现实世界的对象(例如员工、汽车和银行账户)来构建应用程序模型。类定义了现实世界对象的属性和方法。对象是类的实例。
面向对象设计的三个基本组成部分是:
- 面向对象分析——系统的功能
- 面向对象设计——系统架构
- 面向对象编程——应用程序的实现
面向对象编程原则
面向对象编程的三大原则是:
- 封装 封装旨在隐藏实现细节,仅暴露方法。封装的主要目的是:
- 降低软件开发的复杂性——通过隐藏实现细节并仅公开操作,使用类变得容易。
- 保护对象的内部状态——对类变量的访问通过诸如 get 和 set 之类的方法进行。这使得类灵活且易于维护。
- 允许更改类的内部实现,而无需担心会破坏使用该类的代码。
- 遗产 ——这涉及类之间的关系。这种关系表现为父类和子类。子类使用父类中定义的方法。继承的主要目的是:
- 可重用性——多个子类可以继承自同一个父类。当我们需要提供诸如在数据库中添加、更新和删除数据等通用功能时,这非常有用。
- 多态性 ——这指的是使用同一个接口实现多种不同的实现方式。多态性的主要目的是:
- 简化应用程序的维护并使其更具可扩展性。
面向对象 Concepts 在 PHP 中
PHP 是一种面向对象的脚本语言;它支持以上所有原则。以上原则的实现方式如下:
- 封装 – 通过使用“get”和“set”方法以及访问修饰符。
- 遗产 – 通过使用 extends 关键字
- 多态性 – 通过使用 implements 关键字
现在我们已经掌握了 OOP 的基本知识,以及它是如何支持的 PHP让我们来看一些体现上述原则的例子。
什么是 UML?
统一建模语言(UML)是一种用于设计和记录面向对象系统的技术。
UML 会生成许多文档,但我们将重点关注类图,这对面向对象的 PHP 编程非常重要。
类图示例
类图键
- 此 上框 包含类名
- 此 中间框 包含类变量
- 此 下盒 包含类方法
- 此 减 (-) 符号表示私有范围
- 此 加号(+) 符号表示公共范围
- 此 哈希(#) 标志表示受保护的范围
如何在 PHP 中创建类
class 关键字用于在 PHP 中定义类。以下是在 PHP 中创建类的规则。
- 类名应该以字母开头
- 类名不能是 PHP 保留字
- 类名不能包含空格
假设我们要创建一个用于表示动物的类。我们将首先确定所有动物共有的特征。
- 所有动物都属于某个科,例如食草动物、食肉动物等等。
- 所有动物都吃食物
下图显示了该动物的类别图。
现在让我们来编写动物类的代码。
<?php class Animal { private $family; private $food; public function __construct($family, $food) { $this->family = $family; $this->food = $food; } public function get_family() { return $this->family; } public function set_family($family) { $this->family = $family; } public function get_food() { return $this->food; } public function set_food($food) { $this->food = $food; } } ?>
这里,
- “private $family, $food”表示不能在类外部直接访问这些变量(封装)。
- `public function __construct($family…)` 是 PHP 的构造函数方法。每当创建类的实例时,都会调用此函数。在本例中,我们设置了家庭成员和食物信息。
- “public function get…()”是用于访问食品类别或食品值的方法(封装)。
- “public function set…()”是用于设置家族或食物值(封装)的方法。
如何在 PHP 中实现继承
我们将以一头牛和一头狮子为例。牛和狮子都继承自 Animal 类。
下面的类图显示了这些关系。
请注意,牛继承自 Animal 类,并且定义了自己的变量和方法。
现在让我们来编写 Cow 类的代码。
<?php class Cow extends Animal { private $owner; public function __construct($family, $food) { parent::__construct($family, $food); } public function set_owner($owner) { $this->owner = $owner; } public function get_owner() { return $this->owner; } } ?>
现在让我们来编写 Lion 类的代码。
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
这里,
- “class … extends Animal” 使 Cow 类和 Lion 类使用 Animal 类中的方法(继承)。
如何创建该类的对象
为了简单起见,Animal、Cow 和 Lion 类应该都放在同一个目录中。
现在让我们来创建使用我们类的应用程序。
PHP 类示例
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Carnivore', 'Meat'); echo '<b>Cow Object</b> <br>'; echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>'; echo '<b>Lion Object</b> <br>'; echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food(); ?>
测试我们的应用
现在让我们在网页浏览器中查看我们的应用程序。
这两个对象都重用了从 Animal 类继承的 get_family 和 get_food 方法,这体现了继承的实际应用。
如何在 PHP 中实现多态性
假设我们要开发一个能够连接到不同数据库引擎的应用程序,例如: MySQL 和 SQL 服务器使用相同的统一接口。我们可以创建一个接口,定义标准方法和绝对值。trac实现通用方法的类。
- 接口 – 它类似于类。它仅定义方法和参数。
- ABStracT级 – 它是一个不能直接用来创建对象的类。其目的是提供通用方法的部分或全部实现。
下图所示的类图展示了我们各个部分之间的关系tract 类、接口和实现类。
现在让我们来打造我们的腹肌tract 类。
<?php abstract class DBCommonMethods { private $host; private $db; private $uid; private $password; public function __construct($host, $db, $uid, $password) { $this->host = $host; $this->db = $db; $this->uid = $uid; $this->password = $password; } } ?>
这里,
- 腹肌trac“t 类”表示该类不能直接用于创建对象。
- “$host, $db…”是所有实现中通用的类变量。
- “function __construct(…)” 是类构造函数方法,用于在初始化时设置公共变量的值。
现在让我们创建包含标准方法的接口,这些方法将根据数据库引擎的不同而以不同的方式实现。
<?php
interface DBInterface
{
public function db_connect();
public function insert($data);
public function read($where);
public function update($where);
public function delete($where);
}
?>
这里,
- “interface” 是创建接口的关键字
- “public function…(…)” 是应该实现的标准方法
现在让我们创建具体的类,这些类将继承 DBCommonMethods 类并实现 DBInterface 接口。首先, MySQLDriver.php:
<?php class MySQLDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
然后是 MSSQLServerDriver.php:
<?php class MSSQLServerDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
这里,
- “class … extends DBCommonMethods” 使用了 DBCommonMethods 中的方法。
- “…实现 DBInterface”确保无论使用何种数据库驱动程序,该类都能提供标准方法。
使用上述类的代码如下所示:
<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>
或:
<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>
其余代码对于两个驱动程序来说都相同,例如:
<?php $db->db_connect(); $db->insert($data); ?>
这就是多态性的实际应用:相同的方法调用适用于任何实现了该接口的驱动程序,因此在切换数据库引擎时,周围的代码永远不会改变。





