PHP 简明教程

PHP 访问修饰符

1. 什么是访问修饰符?

属性和方法可以具有访问修饰符,这些修饰符定义了它们可以从何处被访问。

在 PHP 中,有三种访问修饰符:

  • public - 属性或方法可以从任何地方访问。这是默认设置。
  • protected - 属性或方法可以在类内部以及派生自该类的类中访问。
  • private - 属性或方法仅能在类内部访问。

2. 属性的访问修饰符示例

在下面的例子中,我们为 Fruit 类添加了三个具有不同访问修饰符的属性($name$color$weight)。如果您尝试在类外部设置这些属性的值,PHP 将根据修饰符的权限决定是否允许操作:

代码示例:

<?php
class Fruit {
  public $name;
  protected $color;
  private $weight;
}

$mango = new Fruit();
$mango->name = 'Mango'; // 允许(public)
$mango->color = 'Yellow'; // 错误(protected)
$mango->weight = '300'; // 错误(private)
?>

3. 方法的访问修饰符示例

与属性类似,方法也可以设置访问权限。默认情况下,如果不写修饰符,所有方法都是 public 的。

在下例中,我们尝试在类外部调用具有不同权限的方法:

代码示例:

<?php
class Fruit {
  public $name;
  public $color;
  public $weight;

  function set_name($n) {  // 默认为 public
    $this->name = $n;
  }

  protected function set_color($n) { // protected 方法
    $this->color = $n;
  }

  private function set_weight($n) { // private 方法
    $this->weight = $n;
  }
}

$mango = new Fruit();
$mango->set_name('Mango'); // OK
$mango->set_color('Yellow'); // 错误
$mango->set_weight('300'); // 错误
?>

4. 访问权限对照表

为了方便记忆,您可以参考下表来了解各修饰符的开放程度:

访问修饰符类内部派生类(子类)类外部(对象实例)
public
protected
private

5. 为什么需要访问修饰符?

既然你辛辛苦苦写的代码,总不希望别人(或者未来的你自己)在类外部随随便便就把内部的核心逻辑给改乱了吧?

访问修饰符是实现封装(Encapsulation)的关键工具。通过将属性设为 privateprotected,并提供 public 的方法(Getter/Setter)来操作它们,您可以:

  • 保护数据完整性:在设置属性值之前进行验证。
  • 隐藏实现细节:外部只需要知道“做什么”,而不需要知道内部“怎么做”。
  • 提高可维护性:内部逻辑的改变不会影响到外部调用者的代码。