本文目录导读:

在 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,这叫"最小权限原则",能提高代码的封装性和安全性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播