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

⚡ 智能摘要

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

  • 🧱 类和对象: 类定义了现实世界事物的属性和方法,对象是该类的一个实例。
  • 🔒 封装: 具有公共 get 和 set 方法的私有变量可以隐藏内部细节并保护对象的状态。
  • 👪 遗产: extends 关键字允许子类重用父类的方法,从而减少重复代码。
  • 🔁 多态: 接口定义了标准方法,许多类在统一的接口框架下以不同的方式实现这些方法。tract.
  • 📐 UML类图: 类图显示了类名、变量和方法,加号、减号和井号分别标记公共、私有和受保护的作用域。
  • 🧩 界面和绝对值tract: 腹肌tract 类共享公共代码,而接口保证每个驱动程序类提供相同的方法。
  • 🤖 人工智能辅助: AI 工具可以根据描述生成 PHP 类,并将过程式代码重构为简洁的面向对象代码。

PHP面向对象编程

什么是 OOP?

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

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

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

面向对象编程原则

面向对象编程的三大原则是:

  • 封装 封装旨在隐藏实现细节,仅暴露方法。封装的主要目的是:
    • 降低软件开发的复杂性——通过隐藏实现细节并仅公开操作,使用类变得容易。
    • 保护对象的内部状态——对类变量的访问通过诸如 get 和 set 之类的方法进行。这使得类灵活且易于维护。
    • 允许更改类的内部实现,而无需担心会破坏使用该类的代码。
  • 遗产 ——这涉及类之间的关系。这种关系表现为父类和子类。子类使用父类中定义的方法。继承的主要目的是:
    • 可重用性——多个子类可以继承自同一个父类。当我们需要提供诸如在数据库中添加、更新和删除数据等通用功能时,这非常有用。
  • 多态性 ——这指的是使用同一个接口实现多种不同的实现方式。多态性的主要目的是:
    • 简化应用程序的维护并使其更具可扩展性。

面向对象 Concepts 在 PHP 中

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

  • 封装 – 通过使用“get”和“set”方法以及访问修饰符。
  • 遗产 – 通过使用 extends 关键字
  • 多态性 – 通过使用 implements 关键字

现在我们已经掌握了 OOP 的基本知识,以及它是如何支持的 PHP让我们来看一些体现上述原则的例子。

什么是 UML?

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

UML 会生成许多文档,但我们将重点关注类图,这对面向对象的 PHP 编程非常重要。

类图示例

面向对象 Concepts 在 PHP 中

类图键

  • 此 上框 包含类名
  • 此 中间框 包含类变量
  • 此 下盒 包含类方法
  • 此 减 (-) 符号表示私有范围
  • 此 加号(+) 符号表示公共范围
  • 此 哈希(#) 标志表示受保护的范围

如何在 PHP 中创建类

class 关键字用于在 PHP 中定义类。以下是在 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 类。

下面的类图显示了这些关系。

在 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” 使 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();
?>

测试我们的应用

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

PHP 中的继承

这两个对象都重用了从 Animal 类继承的 get_family 和 get_food 方法,这体现了继承的实际应用。

如何在 PHP 中实现多态性

假设我们要开发一个能够连接到不同数据库引擎的应用程序,例如: MySQL 和 SQL 服务器使用相同的统一接口。我们可以创建一个接口,定义标准方法和绝对值。trac实现通用方法的类。

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

下图所示的类图展示了我们各个部分之间的关​​系tract 类、接口和实现类。

PHP 中的继承

现在让我们来打造我们的腹肌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);
?>

这就是多态性的实际应用:相同的方法调用适用于任何实现了该接口的驱动程序,因此在切换数据库引擎时,周围的代码永远不会改变。

常见问题

腹肌trac类可以包含已实现的方法和属性,但一个类只能继承一个类。接口只声明方法签名,而一个类可以实现多个接口。使用绝对值。tract 类用于共享代码,接口用于强制执行tract.

这四大支柱是封装、继承、多态性和绝对值。trac本教程重点介绍前三个方面;abstraction 将复杂的细节隐藏在简单的界面背后,PHP 通过 abs 支持这种做法。tract 类和接口。

公共成员在任何地方都可访问,私有成员只能在同一个类内部访问,而受保护成员只能在类及其子类内部访问。它们通过控制谁可以读取或修改每个属性或方法来强制执行封装。

是的。给人工智能提供字段或表定义,它就能生成一个带有类型化属性、构造函数以及get和set方法的类。 Rev在使用类之前,请检查类型并添加验证。

是的。粘贴过程脚本,AI 可以将相关函数和数据分组到类中,应用封装,并建议继承或接口。测试重构后的代码,因为行为应该保持不变。

总结一下这篇文章: