PHP 封装

2025年5月14日 | 阅读 4 分钟

在 PHP 中,封装是一个概念,我们将所有数据和成员函数封装在一起形成一个对象。将数据成员和方法封装成一个单一的单元称为封装。它还允许一个类更改其内部实现,而不影响系统的整体功能。

它有助于保护数据和代码免受外部干扰。PHP 使用访问控制关键字 public、private 和 protected 来实现封装。

封装原则

以下图表展示了面向对象编程方法中的封装概念。

Encapsulation in PHP
  1. Public:通过对象引用,public 类成员可以从任何位置访问,包括类边界之外。
  2. Private:在类内部,private 类成员是可访问的。它阻止成员从类外部访问,即使引用了类实例。
  3. Protected:Protected 成员只能在类及其子类内部访问。

访问修饰符用于面向对象编程,主要用于 private 和 public 成员与类外部代码交互的方式,如上图所示。

私有数据只能由类本身访问。红色“X”表示私有成员不能由类外部的代码直接访问。

通过对象引用,公共函数可以从类外部访问。私有信息的安全访问通常通过公共函数实现。封装是面向对象编程的基本原则之一,它通过明显地向公众隐藏私有特性来实现。

公共

PHP 默认将类成员(包括成员变量和成员函数)设置为 public。

示例

输出

Title: PHP Basics | Price: 380

私有

如前所述,为了遵守封装概念,成员变量不得立即访问。数据成员应该只能访问这些方法。因此,我们必须使方法为 public,成员变量为 private。

示例

输出

Title: PHP Basics
Price: 380

最后一行,echo "Title : $b1->title Price: $b1->price";

这将导致一个致命错误,因为 title 和 price 是 private 的,并且您试图直接从类外部访问它们,这是不允许的。

Protected

在类继承的情况下,授予类成员 protected 访问权限的影响是有效的。我们知道 private 成员无法从任何位置访问类,但 public 成员可以从任何位置访问它。

在允许访问相同类及其派生类的对象的同时,protected 关键字会阻止访问任何其他环境。

在 Book 类示例中,让我们将 title 成员设置为 protected,同时将 price 保持为 private。

由于对象属于同一类,PHP 允许访问两个成员变量。

应该添加一个继承 Book 类的 mybook 类。

由于子类继承了父类的 public 和 protected 成员,因此其对象仍然可以访问成员变量。

然而,构建一个 getmytitle() 函数,该函数尝试访问 Book 类的 protected title 成员字段,并将 mybook 类作为一个独立的类(不是 Book 类的扩展)。

由于 getmytitle() 函数尝试打印 Book 对象的 title,因此会引发一条错误消息,显示无法访问受保护的属性 Book::$title。

示例

输出

Fatal error: Uncaught Error: Cannot access protected property Publication::$name