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)的关键工具。通过将属性设为 private 或 protected,并提供 public 的方法(Getter/Setter)来操作它们,您可以:
- 保护数据完整性:在设置属性值之前进行验证。
- 隐藏实现细节:外部只需要知道“做什么”,而不需要知道内部“怎么做”。
- 提高可维护性:内部逻辑的改变不会影响到外部调用者的代码。