PHP 面向对象编程 (OOP) 概念教程及示例
什么是 OOP?
面向对象是一种软件开发方法,它围绕现实世界中的对象(如员工、汽车、银行账户等)来建模应用程序。类定义现实世界对象的属性和方法。对象是类的一个实例。
面向对象的三个基本组成部分是;
- 面向对象分析——系统的功能
- 面向对象设计——系统架构
- 面向对象编程——应用程序的实现
面向对象编程原则
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 类。
下面的类图显示了这些关系。
请注意,牛继承自动物类,并且也定义了自己的变量和方法。
现在让我们编写 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” 使牛和狮子使用来自 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(); ?>
测试我们的应用
现在让我们在 Web 浏览器中查看我们的应用程序
太棒了吧!现在我们来看看 OOP 的第三个原则,多态性。
假设我们要开发一个连接到不同数据库引擎的应用程序,例如 MySQL 和 SQL 但服务器使用同样统一的接口。
我们可以创建一个定义标准方法的接口和一个实现常用方法的抽象类。
- 接口 – 它类似于类。它仅定义方法和参数。
- 抽象类 – 它是一个不能直接用来创建对象的类。其目的是提供通用方法的部分或全部实现。
下面的类图说明了我们的抽象类、接口和实现类之间的关系。
现在让我们创建抽象类
<?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; } } ?>
这里,
- “抽象类” 意味着该类不能直接用于 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 接口的具体类。 MySQL驱动程序.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 } } ?>
MSSQL服务器驱动程序.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); ?>
Or
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
两个驱动程序的其余代码是相同的,例如;
<?php $db->db_connect(); $db->insert($data); ?>
总结
- 面向对象编程 OOP 是一种强大的技术,它根据现实世界的对象对应用程序进行建模
- 类是具有属性和方法的现实世界对象的表示
- OOP 的三个基本原则是;
- 封装
- 遗产
- 多态性