本文目录导读:

在 PHP 中,属性(也叫成员变量)的权限控制是通过访问修饰符来实现的,主要有 3 种:public、protected、private。
三个访问修饰符
| 修饰符 | 含义 | 能否在类内部访问 | 能否在子类访问 | 能否在类外部访问 |
|---|---|---|---|---|
public |
公开 | |||
protected |
受保护 | |||
private |
私有 |
代码示例
class ParentClass {
public $publicProp = '公开属性';
protected $protectedProp = '保护属性';
private $privateProp = '私有属性';
public function testAccess() {
echo $this->publicProp; // ✅ 可以
echo $this->protectedProp; // ✅ 可以
echo $this->privateProp; // ✅ 可以
}
}
class ChildClass extends ParentClass {
public function testChildAccess() {
echo $this->publicProp; // ✅ 可以(继承到的)
echo $this->protectedProp; // ✅ 可以(继承到的)
echo $this->privateProp; // ❌ 错误!父类的 private 属性不能被继承
}
}
// 外部访问
$obj = new ParentClass();
echo $obj->publicProp; // ✅ 可以
echo $obj->protectedProp; // ❌ 错误
echo $obj->privateProp; // ❌ 错误
在实际项目中的应用场景
常用的最佳实践
private:类内部的私有数据,不希望被外部或子类直接修改protected:需要被子类继承使用,但不能被外部直接访问public:需要被外部直接调用的属性和方法
class User {
private $password; // 密码应该私有,不能直接暴露
protected $email; // email 可以被子类使用,但不能被外部直接改
public $username; // 用户名可以公开访问
public function setPassword($password) {
// 可以通过公开方法控制密码的设置逻辑
$this->password = password_hash($password, PASSWORD_DEFAULT);
}
}
PHP 8.1+ 的 readonly 属性
PHP 8.1 引入了 readonly 关键字,它必须和 public/protected/private 一起使用:
class Product {
public readonly string $name;
public function __construct(string $name) {
$this->name = $name; // 只能在构造方法中赋值
}
}
$product = new Product('手机');
echo $product->name; // ✅ 可以读取
$product->name = '电脑'; // ❌ 错误,readonly 属性不能修改
总结建议
| 如果你的需求是 | 应该用 |
|---|---|
| 任何地方都能访问修改 | public |
| 只能类内部和方法使用,子类也要用 | protected |
| 只能类内部使用,子类和外部都不能用 | private |
| 初始化后不可修改的属性(PHP 8.1+) | readonly + 上述任何一个 |
| 属性不能被外部直接操作,但要提供访问方法 | private + getter/setter |
核心原则:尽量用最严格的权限(private),只在确实需要放宽时才用 protected 或 public,这叫"最小权限原则",能提高代码的封装性和安全性。