PHP中创建类对象必须用new,失败直接报Fatal error;构造函数自动调用且参数需严格匹配;动态类名须写new $className();new static()支持后期静态绑定而new self()不支持;stdClass无封装性与魔术方法,不可替代自定义类。

PHP 中创建类对象不是“选一种写法就行”,而是必须用 new,且失败会直接报错中断执行——没有静默失败,也不返回 null。
用 new ClassName() 实例化是最基本且唯一可靠的方式
类定义后,对象只能通过 new 操作符生成。哪怕类里什么都没写,new EmptyClass() 也合法;但若类名拼错、未 include 或自动加载失败,PHP 就抛出 Fatal error: Uncaught Error: Class "XXX" not found,不会继续往下走。
- 构造函数
__construct()会在new执行时**自动调用**,参数必须严格匹配(PHP 8+ 启用严格模式后类型不匹配也会 fatal) - 不能省略括号:写成
new Person(无括号)在 PHP 8.2+ 已被废弃,8.4 起将彻底报错 - 类名区分大小写,但 PHP 类名本身不敏感(
new person()和new Person()都可能成功),依赖 autoloader 实际加载的文件名
动态类名要用 new $className(),别漏括号
当类名来自变量或配置时,语法是 new $className(...),不是 new $className 或 new ($className)()。漏括号会导致 Parse error。
-
$cls = 'User'; $obj = new $cls();✅ 正确 -
$obj = new $cls;❌ PHP 8.2+ 报 Warning,8.4+ 报 Parse error -
$obj = new ($cls)();❌ 语法错误,PHP 不支持这种写法 - 变量内容必须是已定义或可自动加载的类名,否则仍是
Class "xxx" not found
new static() 和 new self() 在继承中行为完全不同
工厂方法里如果用 new self(),子类调用时仍返回父类实例;而 new static() 支持后期静态绑定(LSB),返回实际调用者类的实例。
立即学习“PHP免费学习笔记(深入)”;
- 父类
A有public static function make() { return new self(); }→B::make()返回A实例 - 同理改用
new static()→B::make()返回B实例 - 若子类重写了关键方法,用
new self()可能导致方法不存在或逻辑错乱,这是线上难排查的隐性 bug
别误把 stdClass 当通用对象构造器
stdClass 是 PHP 内置空类,常被 json_decode() 或动态属性赋值“顺手”用到,但它不是替代自定义类的捷径。
-
$obj = new stdClass(); $obj->name = 'foo';可行,但没类型约束、没方法、没构造逻辑 - 它无法触发任何魔术方法(如
__set、__get),属性全是 public,毫无封装性 - 需要结构化行为时硬套
stdClass,后续加验证、关系、持久化都会卡住
真正容易被忽略的是:对象创建失败不兜底就崩,而构造函数里的异常(比如数据库连接失败)不会被 new 捕获——得靠 try/catch 包住整个 new 表达式,而不是只包构造函数内部。



















