关于访问控制的一首PHP面试题(对属性或方法的访问控制)


在PHP中,访问控制是通过关键字`public`、`protected`和`private`来实现的,这些关键字定义了类成员(属性和方法)的访问级别。以下是一道关于PHP访问控制的面试题及其解析:

**面试题**:

请解释PHP中的访问控制级别,并给出一个包含这些级别的简单类示例,说明它们的使用场景。

**解析与示例**:

PHP中的访问控制级别分为三种:

1. **`public`**:公共的,可以在任何地方被访问。

2. **`protected`**:受保护的,只能被其所在类以及继承该类的子类访问。

3. **`private`**:私有的,只能被其所在类内部访问。

**示例代码**:


<?php
class ParentClass {
    // 公共属性
    public $publicProperty = 'This is public';

    // 受保护属性
    protected $protectedProperty = 'This is protected';

    // 私有属性
    private $privateProperty = 'This is private';

    // 公共方法
    public function publicMethod() {
        echo $this->publicProperty . "\n";
        echo $this->protectedProperty . "\n"; // 内部访问受保护属性
        // echo $this->privateProperty; // 这里会报错,因为private属性不能从外部访问
    }

    // 受保护方法
    protected function protectedMethod() {
        echo $this->protectedProperty . "\n";
        // echo $this->privateProperty; // 内部访问是允许的
    }

    // 私有方法
    private function privateMethod() {
        echo $this->privateProperty . "\n";
    }

    // 公共方法调用私有和受保护方法
    public function showAllProperties() {
        $this->publicMethod();
        $this->protectedMethod(); // 这里会报错,因为protectedMethod不能被外部直接调用
        // $this->privateMethod(); // 这里也会报错,因为privateMethod不能被外部直接调用

        // 可以通过调用公共方法来间接访问受保护和私有成员
        $this->indirectAccessPrivate();
    }

    // 间接访问私有方法
    public function indirectAccessPrivate() {
        $this->privateMethod();
    }
}

// 实例化ParentClass
$obj = new ParentClass();

// 访问公共属性和方法
echo $obj->publicProperty . "\n";
$obj->publicMethod();

// 尝试访问受保护和私有成员将导致错误(除非通过公共方法间接访问)
// echo $obj->protectedProperty; // 错误
// echo $obj->privateProperty; // 错误
// $obj->protectedMethod(); // 错误
// $obj->privateMethod(); // 错误

// 正确的方式:通过公共方法间接访问
$obj->showAllProperties();
?>

**注意**:

- 在示例中,我注释了一些会导致错误的代码行,以说明直接访问受保护和私有成员的限制。

- `indirectAccessPrivate`方法展示了如何通过公共方法间接访问私有方法。

- 在实际开发中,合理使用访问控制级别是封装和隐藏实现细节的重要手段,有助于提高代码的安全性和可维护性。