PHP 8.3 并未移除默认访问属性写法,该写法早在 PHP 8.0 已被移除;需重点关注:1. 未声明属性的动态赋值触发弃用警告;2. var 声明在 PHP 8.0+ 已解析失败;3. readonly 属性新增默认值支持。

PHP 8.3 并不强制移除默认访问属性写法(如 var $name; 或省略 public/private/protected 的属性声明),但这类写法早在 PHP 7.4 就已被废弃,并在 PHP 8.0 中正式移除。因此,所谓“PHP 8.3 统一移除”是一种常见误解——实际影响发生在更早版本,而 8.3 只是延续并强化了严格性要求。
真正需要你关注的,是那些在 PHP 8.3 中首次触发弃用警告或行为变更、且与属性定义强相关的高频旧写法。迁移时应聚焦以下三类关键点:
1. 动态属性赋值(最常翻车)
PHP 8.3 开始对未声明属性的运行时赋值发出 Deprecated: Creation of dynamic property 警告。
这不是语法错误,但会污染日志、干扰监控,且未来(PHP 9.0)将直接报错。
- 类中未定义
$email,却执行$user->email = 'a@b.c';→ 触发警告 - 常见于数组转对象(
json_decode($json, false))、ORM 模型填充、表单绑定等场景
✅ 解决方案:
- 显式声明所有预期属性(推荐)
- 或对确需动态扩展的类加
#[AllowDynamicProperties]注解
#[AllowDynamicProperties]
class ApiResponse {
public string $status;
}
// $resp = new ApiResponse();
// $resp->data = [...]; // ✅ 允许2. 隐式 public 属性声明(已失效,但旧代码仍存)
PHP 5.x 允许 var $name;,PHP 7.4 起报 Deprecated,PHP 8.0+ 直接 Parse error。
若项目还残留此类代码,升级到任何 8.x 版本都会失败,不单是 8.3。
✅ 必须替换为显式访问修饰符:
立即学习“PHP免费学习笔记(深入)”;
// ❌ 错误(PHP 8.0+ 不解析) var $id; // ✅ 正确(全部改为) public int $id; protected string $title; private array $meta;
3. readonly 属性初始化方式变化(PHP 8.3 新增支持)
PHP 8.3 允许为 readonly 属性设置默认值(此前必须在 __construct 中赋值):
class DTO {
public readonly string $locale = 'en'; // ✅ PHP 8.3 支持
public readonly array $tags = ['default']; // ✅
}⚠️ 注意:若旧项目已用 readonly 但依赖构造函数初始化,无需改动;但若想简化代码,可逐步迁移到默认值写法。
不复杂但容易忽略



















