在PHP面向对象编程中,访问控制修饰符决定了类中的属性与方法能否被外部代码、子类或仅本类自身访问。PHP提供了三种访问级别:public、private和protected。正确使用它们不仅能保护数据安全,还能让类结构更清晰、易扩展。

一、public:完全公开的访问级别
被声明为public的成员,可以在类的内部、继承该类的子类中,以及通过类实例化的对象在外部脚本里任意访问。这是限制最宽松的修饰符,通常适用于那些需要对外提供服务的接口方法,比如获取用户信息的getter,或执行核心业务的公共入口。
在实际开发中,如果一个方法只是类对外暴露的能力,而不涉及内部状态细节,就可以设为public。但要注意,把过多属性设为public会破坏封装性。例如下面的代码,外部能直接修改$name,可能导致数据不一致:
<?php
class User {
public $name;
public function sayHello() {
return "你好,我是" . $this->name;
}
}
$u = new User();
$u->name = "张三";
echo $u->sayHello();
?>
上面的写法虽然方便,但任何外部代码都能改写$name,类无法对赋值做校验。因此public属性应谨慎使用,更多时候我们会用public方法去间接控制属性读写。
二、private:仅限本类内部的私有成员
private修饰的成员只能在该类自身的内部方法中访问,子类无法继承或使用,外部对象更不能直接调用。它用于隐藏那些纯属实现细节、不应暴露给外界的逻辑,比如内部缓存、加密盐值或辅助计算过程。
使用private能有效防止子类或调用方依赖不该依赖的内部结构,从而降低代码耦合。以下示例将密码哈希过程设为private,外部和子类都不能绕过它:
<?php
class Account {
private $salt = "abc123";
private function hashPassword($pwd) {
return md5($pwd . $this->salt);
}
public function check($pwd) {
return $this->hashPassword($pwd) === $this->stored;
}
}
?>
若试图在子类里写parent::hashPassword(),PHP会报致命错误。这种强隔离让类的作者能自由重构私有逻辑,而不必担心影响外部系统。不过private也意味着无法被复用,若子类确需相似功能,应考虑改为protected。
三、protected:家族内部的受保护成员
protected处于public与private之间:本类与子类可访问,但外部对象不可直接触碰。它非常适合那些父类提供基础实现、并允许子类按需重写或调用的场景,例如模板方法模式中的步骤方法。
假设我们有一个基类定义数据导出流程,其中连接数据库的细节允许子类调整但禁止外界干预,就可以用protected。如下代码展示了这种继承关系:
<?php
class Exporter {
protected function connect() {
return "默认连接";
}
public function run() {
return $this->connect() . "导出中";
}
}
class MysqlExporter extends Exporter {
protected function connect() {
return "MySQL连接";
}
}
$e = new MysqlExporter();
echo $e->run();
// 外部调用 $e->connect() 会报错
?>
通过protected,子类MysqlExporter重写了connect,而外部仍只能通过public的run来使用。这样既保留了扩展能力,又守住了边界。在设计可继承的类时,protected是平衡灵活与安全的常用选择。
四、三者区别对比与设置建议
为了直观理解作用域,可以用一张表来归纳。注意同一类内部不论哪种修饰符都能互访,差异只体现在子类与外部。
| 修饰符 | 本类内部 | 子类 | 外部对象 |
|---|---|---|---|
| public | 可访问 | 可访问 | 可访问 |
| protected | 可访问 | 可访问 | 不可访问 |
| private | 可访问 | 不可访问 | 不可访问 |
在设置PHP类访问控制时,推荐遵循最小权限原则:默认用private,当发现子类需要时用protected,只有真正要对外部提供能力时才公开为public。属性通常不直接public,而是通过public的getter和setter方法配合私有属性,以便在赋值或读取时加入校验与日志。
另外,PHP 7以后支持private方法的重写检测更严格,而抽象类中的protected抽象方法强制子类实现。合理搭配这些特性,能让团队协作时代的类库更稳健。掌握public、private、protected的区别,是写出可维护PHP面向对象代码的第一步。
PHP访问控制public_private_protected修改时间:2026-07-31 16:21:28