PHP 面向对象编程 (OOPs) 概念教程及示例

什么是 OOPs?

面向对象是一种软件开发方法,它将应用程序建模为围绕现实世界对象,例如员工、汽车、银行账户等。类定义了现实世界对象的属性和方法。对象是类的实例。

面向对象的三个基本组成部分是:

  • 面向对象分析 – 系统功能
  • 面向对象设计 – 系统架构
  • 面向对象编程 – 应用程序实现

面向对象编程原则

OOP 的三大基本原则是:

  • 封装 – 这关乎隐藏实现细节,只暴露方法。封装的主要目的是:
  • 降低软件开发复杂性 – 通过隐藏实现细节并只暴露操作,使用类变得容易。
  • 保护对象的内部状态 – 通过 get 和 set 等方法访问类变量,这使得类更灵活且易于维护。
  • 可以在不担心破坏使用该类的代码的情况下更改类的内部实现。
  • 继承 – 这关乎类之间的关系。这种关系以父子形式出现。子类使用父类中定义的方法。继承的主要目的是:
  • 可重用性 – 多个子类可以继承自同一个父类。当我们必须提供通用功能,例如从数据库添加、更新和删除数据时,这非常有用。
  • 多态 – 这关乎具有单一形式但有多种不同的实现方式。多态的主要目的是:
  • 简化应用程序的维护并使其更具可扩展性。

PHP 中的 OOPs 概念

PHP 是一种面向对象的脚本语言;它支持上述所有原则。上述原则通过以下方式实现:

  • 封装 – 通过使用“get”和“set”方法等。
  • 继承 – 通过使用 `extends` 关键字
  • 多态 – 通过使用 `implements` 关键字

现在我们对 OOP 及其在 PHP 中的支持有了基本了解,让我们来看一些实现上述原则的示例。

什么是 UML?

统一建模语言 UML 是一种用于设计和记录面向对象系统的技术。

UML 会生成一系列文档,但我们将重点关注类图,它对于面向对象的 PHP 编程非常重要。

类图示例

OOPs Concepts in PHP

类图键

  • 顶部框包含类名
  • 中间框包含类变量
  • 底部框包含类方法
  • 减号(-)表示私有作用域
  • 加号(+)表示公有作用域
  • 井号(#)表示受保护作用域

如何在 PHP 中创建类

在 PHP 中,`class` 关键字用于定义类。以下是创建 PHP 类的规则:

  • 类名应以字母开头
  • 类名不能是 PHP 保留字
  • 类名不能包含空格

假设我们要创建一个表示动物的类。

我们将从识别所有动物的共同特征开始。

  • 所有动物都属于一个科,例如食草动物、食肉动物等。
  • 所有动物都吃食物

下图显示了动物的图示。

Create a class in 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` 类。

下图显示了它们之间的关系。

implement Inheritance in PHP

请注意,牛继承自 `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();
?>

测试我们的应用程序

现在我们在网络浏览器中查看我们的应用程序。

Inheritance in PHP

很棒,对吧!现在让我们来看 OOP 的第三个原则,多态。

假设我们要开发一个应用程序,该应用程序可以连接到不同的数据库引擎,如 MySQL 和 SQL Server,但使用相同的统一接口。

我们可以创建一个接口来定义标准方法,并创建一个抽象类来实现通用方法。

  • 接口 – 它类似于类。它只定义方法和参数。
  • 抽象类 – 它是一个不能直接用于创建对象的类。它的目的是提供通用方法的全部或部分实现。

下图说明了我们的抽象类、接口和实现类之间的关系。

Inheritance in PHP

现在让我们创建我们的抽象类。

<?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 的三个基本原则是:
  • 封装
  • 继承
  • 多态