PHP 8.3 创建类必须显式声明属性可见性(禁用 var)、使用合法类名、构造方法需 public 且建议类型声明,属性初始化仅支持字面量,$this 访问不可省略,动态类名削弱类型安全。
PHP 8.3 创建类不是“加个 class 就完事”,关键在语法合规、可见性明确、构造逻辑可靠——漏掉
修饰符、误用
声明、或在构造方法里没校验参数,都会导致对象属性不可写、
报错或实例化静默失败。
class 关键字后必须跟合法类名,且不能用 var 声明属性
PHP 8.3 已完全弃用
(自 PHP 7.4 起废弃,8.0+ 报
,8.3 运行时直接拒绝解析)。所有属性必须显式使用
/
/
修饰。
✅ 合法
❌ 解析失败,报
类名必须是合法标识符:首字符为字母或下划线,后续仅含字母、数字、下划线;
可以,
或
不行
类定义不支持表达式初始化属性(如
),只能赋字面量或
;动态值必须挪到
中
__construct() 必须显式声明访问控制,且参数类型建议标注
PHP 8.3 强制要求构造方法带访问修饰符,否则默认为
但会触发
(尤其在严格模式下)。同时,类型声明能提前拦截非法传参,避免运行时崩溃。
✅ 推荐:类型安全 + 明确意图
❌ 隐式 public,但无类型约束,
不报错却埋雷
构造方法内可用
主动拒绝非法值,比让属性留空更可控
若无需初始化,也必须写
,空实现比省略更清晰
new 实例化时,类名不能是变量字符串除非明确允许
直接
最稳妥;用变量类名(如
)虽语法允许,但在严格依赖注入或 IDE 补全场景下极易出错,且无法静态分析类型。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
✅ 直接调用,IDE 可跳转、类型推导准
⚠️ 可运行,但
类型被推为
,后续调用方法无提示、无校验
若必须动态实例化(如工厂模式),优先用
或配置映射,而非裸字符串拼接类名
和
在 8.3 中行为不变,但注意
指当前类而非实例化时的子类(需
实现后期静态绑定)
对象属性访问必须符合可见性规则,$this 是硬性要求
类内部访问自身属性/方法必须用
或
;漏掉
会被当作局部变量处理,导致属性未设置、方法未调用却无任何报错。
✅ 正确
❌ 局部变量赋值,
仍是
外部访问
属性(如
)直接报
,不会静默失败
在 8.3 中仍受可见性限制:对
属性返回
,哪怕它已存在
最易被忽略的是构造方法参数类型与实际传入值的隐式转换边界——比如声明
却传
,PHP 8.3 默认启用严格类型检查(
),此时会直接抛
;不声明则自动转整型,可能掩盖数据污染问题。
publicvar$thisvarE_DEPRECATEDpublicprotectedprivateclass User { public $name; private $id; }class User { var $name; }Parse error: syntax error, unexpected 'var'UserModel2UserUser-Datapublic $ts = time();null__construct()publicE_WARNINGpublic function __construct(string $name, int $age)function __construct($name)new User([])throw new InvalidArgumentException()public function __construct() {}new User()$class = 'User'; new $class()$u = new User('Alice', 28);$cls = 'User'; $u = new $cls('Alice', 28);$uobjectmatchclonenew self()selfstatic$this->prop$this->method()$thispublic function setName(string $name): void { $this->name = $name; }public function setName(string $name): void { $name = $name; }$this->namenullprivate$u->nameFatal error: Cannot access private propertyisset($u->name)privatefalseint $id'123'declare(strict_types=1)TypeError