PHP面向对象的核心是封装数据与逻辑为可复用单元,访问控制符划定责任边界,构造函数须专注可控初始化,static方法仅用于无状态操作,职责分离决定行为归属。
PHP 面向对象不是“换种写法”,而是把数据和操作它的逻辑打包成可复用、可追踪的单元——类是模具,对象是按模具压出来的具体零件。
类定义里 public / protected / private 到底该选哪个
访问控制不是为了加锁,而是划清责任边界:谁该读、谁该改、谁只能内部用。public 暴露太多,后续改字段名或逻辑会牵一发而动全身;private 过度封闭,导致外部不得不绕路调用(比如硬写 getter/setter);protected 是父子类协作的默认起点。
仅用于明确要被外部直接调用的方法(如
、
),或极少数稳定不变的常量(如
)
优先用于纯内部状态,比如缓存计算结果的
,外部根本不需要知道它存在
适合可能被子类覆盖或扩展的行为,比如
方法,父类留钩子,子类决定校验规则
new 关键字创建对象时容易忽略的初始化陷阱
PHP 的
不是“可选补充”,而是对象生命周期的真正起点。漏掉它,或在里面做耗时/依赖外部的操作(比如连接数据库、读文件),会导致对象处于半初始化状态,后续调用方法时报错却找不到源头。
构造函数里只做必要且可控的初始化:赋值属性、设置默认状态、验证必传参数(用
)
避免在
中调用可能失败的外部服务;把这类操作拆到单独方法(如
),由调用方显式触发
如果类需要从数组或 JSON 构建实例,别硬塞进
,另写静态工厂方法更清晰:
什么时候该用 static 方法,什么时候必须用实例方法
方法不持有对象状态,本质是“挂靠在类名下的函数”。滥用它会让代码变僵硬——比如把数据库查询写成
,看似方便,实则隐藏了依赖(PDO 实例从哪来?事务怎么控制?),测试时无法 mock。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
用
只处理无状态转换:格式化时间(
)、解析字符串(
)
涉及对象自身数据的操作,必须用实例方法:计算用户积分(
)、更新头像路径(
)
若真需要“类级别”的行为(如单例、全局配置),优先考虑依赖注入容器,而不是靠
硬编码生命周期
类的设计难点不在语法,而在判断哪些状态该绑定到对象上、哪些该抽离出去。一个
类是否该包含
?要看邮件发送是否属于“用户自身职责”,还是应该交给独立的
——后者更容易替换邮件服务商、加日志、做队列。
publicsave()toJson()STATUS_ACTIVE = 1private$this->cachedTotalprotectedvalidate()__construct()throw new InvalidArgumentException__construct()loadFromApi()__construct()User::fromArray($data)staticUser::find($id)staticDateTimeHelper::formatIso8601($ts)JsonParser::decode($json)$user->calculatePoints()$user->updateAvatar($path)staticUsersendWelcomeEmail()EmailService