在PHP中,面向对象编程(OOP)的一个关键特性是封装,它允许我们隐藏对象的内部实现细节,只对外暴露有限的接口。访问修饰符是实现封装的重要手段之一,它们决定了类成员的访问级别。PHP支持以下三种访问修饰符:
1. **public(公共的)**
- 可以在任何地方被访问,即不受任何限制。
- 可以被类内部、子类以及类外部访问。
2. **protected(受保护的)**
- 允许被其自身以及子类和父类访问,但不能被类外部的代码访问。
- 提供了一种封装方式,允许子类继承父类的成员,但不希望这些成员被外部直接访问。
3. **private(私有的)**
- 只能被其定义所在的类内部访问。
- 这是封装性最强的访问修饰符,它完全隔离了类内部的实现细节。
### 示例代码
<?php
class MyClass {
public $publicVar = '这是公共变量';
protected $protectedVar = '这是受保护变量';
private $privateVar = '这是私有变量';
public function publicMethod() {
echo $this->publicVar . "\n";
echo $this->protectedVar . "\n";
echo $this->privateVar . "\n";
}
protected function protectedMethod() {
echo $this->publicVar . "\n";
echo $this->protectedVar . "\n";
// 这里不能访问 $this->privateVar,因为是在保护方法中
}
// 私有方法不能从类外部或子类访问
private function privateMethod() {
echo $this->publicVar . "\n"; // 这是可以的,因为我们在类内部
echo $this->protectedVar . "\n"; // 这也是可以的
echo $this->privateVar . "\n"; // 私有成员在私有方法内是可以访问的
}
}
$obj = new MyClass();
echo $obj->publicVar . "\n"; // 正确,因为 $publicVar 是公共的
// echo $obj->protectedVar; // 错误,因为 $protectedVar 是受保护的
// echo $obj->privateVar; // 错误,因为 $privateVar 是私有的
$obj->publicMethod(); // 正确,因为 publicMethod 是公共的,且能在其中访问所有成员
// $obj->protectedMethod(); // 错误,因为 protectedMethod 是受保护的,外部不能访问
// $obj->privateMethod(); // 错误,因为 privateMethod 是私有的,外部不能访问
?>
这个示例展示了如何在PHP类中使用不同的访问修饰符来定义成员变量和方法,并说明了它们的访问范围。