真正掌握php面向对象要从写第一个class开始,聚焦封装边界、构造函数职责、protected合理使用及依赖注入,而非死记语法或过早学习继承多态。

PHP面向对象不是靠背概念学会的,得从写第一个 class 开始,边改边错边理解——真正卡住人的从来不是语法,而是“什么时候该封装”“为什么这里要用 protected 而不是 public”这类设计判断。
从 new 一个对象开始,别先碰继承和多态
新手一上来就学 extends 和 interface,容易把类当模板套,反而忽略对象本身的行为逻辑。先专注三件事:
- 用
class定义一个有明确职责的类,比如User或Logger,不是“万能工具类” - 所有属性加访问修饰符,哪怕暂时全用
public,也要写出来——强迫自己思考“这个值谁该改?” - 每个方法只做一件事,比如
save()不负责校验,validate()不负责写入数据库
示例中常见错误:$user->name = "xxx" 直接赋值,但没配 setName() 方法;后续加密码加密、长度限制时就得全局搜 ->name =,这就是没在初期建立封装边界。
__construct() 里只放必要初始化,别塞业务逻辑
构造函数不是“启动器”,它的唯一责任是让对象处于可用状态。下面这些都算越界:
- 在
__construct()里调用file_get_contents()加载配置文件 - 连接数据库并执行查询
- 触发日志记录或发送通知
真正该放的只有:$this->id = $id、$this->status = self::STATUS_PENDING 这类纯赋值动作。否则对象无法被单元测试、无法被 DI 容器管理,也违背了“单一职责”——构造即创建,不等于运行。
别迷信 private,protected 才是日常主力
很多教程强调“一律用 private”,结果导致子类只能重复写一堆相似逻辑。真实项目中:
-
private适合真正只属于当前类的内部状态,比如缓存计算结果的临时变量$this->cachedFullName -
protected是继承链的接口:父类留出可被子类覆盖的方法(如canAccess()),或供子类复用的工具方法(如formatDate()) -
public只暴露调用入口,比如login()、exportCsv(),而非数据字段
一个典型反例:private function connectDb() 写死在父类里,子类想换数据库驱动就得复制整个类——改成 protected function createConnection(),子类重写即可,这才是可扩展的设计。
写完类立刻问自己:它能不能独立 new 出来并跑通?
这是检验是否真懂 OOP 的硬标准。如果 new User() 必须依赖外部传入一个已初始化的 Database 实例,那它就不是完整对象,而是“半成品”。解决方式只有两个:
- 把依赖通过构造函数参数注入(推荐),例如
public function __construct(Database $db) - 或用工厂方法封装创建逻辑,比如
UserFactory::createActiveUser($email)
绕开这点去讲“多态”或“设计模式”,就像教人开车前先背《交通法》全文——知识堆得再满,轮子离地就没意义。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











