PHP面向对象——访问修饰符介绍


在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类中使用不同的访问修饰符来定义成员变量和方法,并说明了它们的访问范围。