PHP 怎么PHP 属性权限

wen PHP项目 2

本文目录导读:

PHP 怎么PHP 属性权限

  1. 三个访问修饰符
  2. 代码示例
  3. 在实际项目中的应用场景
  4. PHP 8.1+ 的 readonly 属性
  5. 总结建议

在 PHP 中,属性(也叫成员变量)的权限控制是通过访问修饰符来实现的,主要有 3 种:publicprotectedprivate

三个访问修饰符

修饰符 含义 能否在类内部访问 能否在子类访问 能否在类外部访问
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),只在确实需要放宽时才用 protectedpublic,这叫"最小权限原则",能提高代码的封装性和安全性。

抱歉,评论功能暂时关闭!