PHP 面向对象编程 (OOPs) 概念教程及示例
什么是 OOPs?
面向对象是一种软件开发方法,它将应用程序建模为围绕现实世界对象,例如员工、汽车、银行账户等。类定义了现实世界对象的属性和方法。对象是类的实例。
面向对象的三个基本组成部分是:
- 面向对象分析 – 系统功能
- 面向对象设计 – 系统架构
- 面向对象编程 – 应用程序实现
面向对象编程原则
OOP 的三大基本原则是:
- 封装 – 这关乎隐藏实现细节,只暴露方法。封装的主要目的是:
- 降低软件开发复杂性 – 通过隐藏实现细节并只暴露操作,使用类变得容易。
- 保护对象的内部状态 – 通过 get 和 set 等方法访问类变量,这使得类更灵活且易于维护。
- 可以在不担心破坏使用该类的代码的情况下更改类的内部实现。
- 继承 – 这关乎类之间的关系。这种关系以父子形式出现。子类使用父类中定义的方法。继承的主要目的是:
- 可重用性 – 多个子类可以继承自同一个父类。当我们必须提供通用功能,例如从数据库添加、更新和删除数据时,这非常有用。
- 多态 – 这关乎具有单一形式但有多种不同的实现方式。多态的主要目的是:
- 简化应用程序的维护并使其更具可扩展性。
PHP 中的 OOPs 概念
PHP 是一种面向对象的脚本语言;它支持上述所有原则。上述原则通过以下方式实现:
- 封装 – 通过使用“get”和“set”方法等。
- 继承 – 通过使用 `extends` 关键字
- 多态 – 通过使用 `implements` 关键字
现在我们对 OOP 及其在 PHP 中的支持有了基本了解,让我们来看一些实现上述原则的示例。
什么是 UML?
统一建模语言 UML 是一种用于设计和记录面向对象系统的技术。
UML 会生成一系列文档,但我们将重点关注类图,它对于面向对象的 PHP 编程非常重要。
类图示例
类图键
- 顶部框包含类名
- 中间框包含类变量
- 底部框包含类方法
- 减号(-)表示私有作用域
- 加号(+)表示公有作用域
- 井号(#)表示受保护作用域
如何在 PHP 中创建类
在 PHP 中,`class` 关键字用于定义类。以下是创建 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` 类,并且也定义了它自己的变量和方法。
现在让我们编写牛类的代码。
<?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; } } ?>
现在让我们编写狮子类的代码。
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
此处,
- “class … extends Animal” 使牛和狮子可以使用 `Animal` 类中的方法(继承)。
如何创建类的对象
为了简单起见,`Animal`、`Cow` 和 `Lion` 类都应该在同一个目录中。
现在让我们创建使用我们类的应用程序。
PHP 类示例
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Canirval', '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(); ?>
测试我们的应用程序
现在我们在网络浏览器中查看我们的应用程序。
很棒,对吧!现在让我们来看 OOP 的第三个原则,多态。
假设我们要开发一个应用程序,该应用程序可以连接到不同的数据库引擎,如 MySQL 和 SQL Server,但使用相同的统一接口。
我们可以创建一个接口来定义标准方法,并创建一个抽象类来实现通用方法。
- 接口 – 它类似于类。它只定义方法和参数。
- 抽象类 – 它是一个不能直接用于创建对象的类。它的目的是提供通用方法的全部或部分实现。
下图说明了我们的抽象类、接口和实现类之间的关系。
现在让我们创建我们的抽象类。
<?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; } } ?>
此处,
- “abstract class” 意味着该类不能直接用于创建 PHP 对象。
- “$host,$db…” 是所有实现通用的类变量。
- “function __construct(…)” 是 PHP 类构造函数方法,它在初始化时设置通用变量值。
现在让我们创建包含标准方法的接口,这些方法将根据数据库引擎以不同的方式实现。
<?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` 中的方法。
- “… implements DBInterface” 确保类提供标准方法,而不管使用何种数据库驱动程序。
上述代码的用法 使用上述类的代码如下。
<?php $db = new MySQLDriver($host,$db,$uid,$password); ?>
或者
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
对于两个驱动程序,其余代码将相同,例如:
<?php $db->db_connect(); $db->insert($data); ?>
摘要
- 面向对象编程 OOP 是一种强大的技术,它将应用程序建模为现实世界对象。
- 类是具有属性和方法的现实世界对象的表示。
- OOP 的三个基本原则是:
- 封装
- 继承
- 多态