PHP 访问修饰符

2025 年 4 月 17 日 | 6 分钟阅读

PHP 将“public”、“private”和“protected”这几个术语称为“访问修饰符”。这些关键字控制类属性和方法的可见性或可访问性。在声明成员变量和指定成员函数时,会在其中一个术语前加上前缀。

PHP 的访问修饰符

这些关键字决定了类成员是自由访问、条件访问还是被 PHP 代码禁止访问。

Public - 类成员可以通过对象引用从任何地方(包括类范围之外)进行访问。这些关键字决定了 PHP 代码对类成员是具有条件访问、禁止访问还是授予自由访问。

  1. Public: 通过对象引用,公共类成员可以从任何位置(包括类边界之外)进行访问。
  2. Private: 在类本身内部,私有类成员是可以访问的。它阻止了类外部的成员访问,即使引用了类实例。
  3. Protected: 受保护的成员只能在类及其子类中访问。

数据封装的概念是面向对象编程范例的基础。它描述了一个将对象的属性或数据成员保存在类外部环境无法访问的系统,只允许通过类的特定方法或 函数进行受限访问。

面向对象编程中的访问控制

为了实现封装,类的所有方法都设置为 public,而其数据成员则设置为 private。

Access Specifiers in PHP

访问修饰符在面向对象编程中使用,主要体现在如上图所示的私有和公共成员与类外部代码的交互方式。

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

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

公共

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

示例

立即执行

输出

Title: PHP Basics | Price: 380

私有

如前所述,为了遵循封装原则,成员 变量不应直接可访问。数据成员只应可供方法访问。因此,我们必须将方法设置为 public,将成员变量设置为 private。

示例

立即执行

输出

Title: PHP Basics
Price: 380

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

这将导致一个致命错误,因为 title 和 price 是私有的,而您正试图在类外部直接访问它们,这是不允许的。

Protected

在类 继承的情况下,授予类成员受保护访问的效果是有效的。我们知道私有成员无法从任何地方访问类,但公共成员可以从任何地方访问它。

Protected 关键字阻止了任何其他环境的访问,但允许同一类及其派生类的对象访问。

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

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

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

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

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

当 getmytitle() 函数尝试打印 Book 对象的 title 时,会显示错误消息 Cannot access protected property Book::$title。

示例

立即执行

输出

Fatal error: Uncaught Error: Cannot access protected property Book::$title

PHP 中访问修饰符的区别

功能 / 修饰符publicprotectedprivate
可见性可从任何地方访问可在类及其子类(派生类)中访问只能在定义它的类中访问
来自同一类的访问是的是的是的
来自子类的访问是的是的不能
来自类外部的访问是的不能不能
用于需要全局访问的 Public API 方法/属性基于继承的访问,基类和派生类之间的共享逻辑严格封装,仅内部逻辑
常见示例返回数据的函数 (getDetails())帮助子类执行任务的函数 (calculateScore())辅助函数或密码等敏感数据
继承继承且可访问继承且可访问继承但不可访问
封装级别低(暴露最多)中等(仅限于继承链)高(最强大的数据保护)
最佳实践用于应用程序中需要的 API 或函数用于基类中的受保护辅助方法用于内部类逻辑和敏感数据
 

示例

立即执行

输出

Welcome John Doe
Your current balance is 10000
Calculating Interest
Annual Interest is 500
Account Holder Name is John Doe
Account Balance is 10000
Pin Code is 1234