类是模板,new出的对象才是实体;未在__construct()中用$this->赋值会导致属性为null,public/private/protected需按封装原则选用,$this仅在实例方法中有效且不可省略。

class 定义的是模板,new 出来的才是能干活的实体——不理解这点,写再多 class 也只会堆出无法调试、不敢复用的“假面向对象”代码。
为什么 new 一个对象后属性还是 null?
常见现象:类里声明了public $name;,new User() 后 $user->name 输出空或 Notice: Undefined property
根本原因在于没初始化,而 PHP 不会自动给未赋值属性设默认值(哪怕声明为 public $name;)
- 构造方法 __construct() 是唯一可靠的初始化入口,别依赖属性声明时的“默认值”写法(如 public $name = ''; 看似安全,但一旦构造逻辑变复杂,它就成干扰项)
- 如果构造函数接收参数,必须显式传入:new User('Alice'),不能漏掉括号或参数
- 在 __construct() 内部,务必用 $this->name = $name; 赋值;写成 $name = $name; 只是定义了个局部变量,对对象毫无影响
public / private / protected 到底该选哪个?
不是“默认 public 最省事”,而是看数据是否需要被外部直接读写 -public:仅适用于完全无业务约束、无需校验的字段,比如配置开关 $debugMode
- private:敏感数据(如 $passwordHash)、内部状态(如 $isConnected)必须封死,外部只能通过 setPassword() 或 connect() 这类方法间接操作
- protected:留给继承场景,比如基类 DatabaseConnection 的 $pdo 属性,子类可复用但外部不可见
- 错误示范:private $email; 却在外部强行写 $user->email = 'x@y.z'; → 致命错误;正确做法是加 public function setEmail($email) 并在里面做格式验证
为什么 $this->xxx 总报错“undefined”?
$this 不是全局变量,它只在类的方法体内有效,且严格绑定到“当前正在执行该方法的那个对象”
- 在静态方法 public static function count() 里用 $this->name → 直接报错,因为静态方法不属于任何实例
- 在普通方法里,调用其他方法必须带 $this-> 前缀:$this->validate();,不能简写为 validate();(那会被当成普通函数调用)
- 属性读写同理:echo $this->name; 正确,echo $name; 是读取局部变量,大概率为空
- 构造函数里漏掉 $this-> 是高频翻车点,例如:public function __construct($id) { $id = $id; } —— 这行完全没作用
真正卡住人的从来不是语法记不住,而是把“类”当成了高级数组来用,忘了它本质是一套行为+状态的封装契约。每个 new 出来的对象都该有明确的生命周期起点(<strong>construct</strong>)和终点(destruct),中间所有操作都该围绕这个契约展开。



















