php 7.1 中匿名类的属性必须显式声明 public、protected 或 private,不可省略;public 属性可外部读写,protected/private 仅内部方法可用,且匿名类不支持继承和动态添加属性。

PHP 7.1 中的匿名类本身不支持“默认访问属性”这一说法——匿名类的属性(即在类体内声明的变量)**必须显式指定访问控制关键字**(public、protected 或 private),否则会触发语法错误。
匿名类中属性必须声明可见性
与普通命名类一样,PHP 自 7.0 引入匿名类后,其语法严格遵循 OOP 规则。匿名类内部若定义属性,不能省略访问修饰符:
-
❌ 错误写法(解析失败):
$obj = new class { $name = 'test'; };→ 报错:Parse error: syntax error, unexpected '$name' -
✅ 正确写法(必须加 public/protected/private):
$obj = new class { public $name = 'test'; };→ 合法
public 是最常用且唯一可在类外直接读写的选项
匿名类中声明为 public 的属性,可被外部代码自由访问和修改:
$obj = new class { public $id = 123; public $label = 'demo'; };echo $obj->id; // 输出 123$obj->label = 'new'; // 允许赋值
protected/private 属性在匿名类中受限但有效
虽然匿名类无法被继承(无类名,无法 extends),但 protected 和 private 仍具语法效力,主要影响内部方法访问逻辑:
-
private $secret = 'x';:仅能在该匿名类的方法内通过$this->secret访问 -
protected $config = [];:同上;即使匿名类被用于继承场景(如new class extends ParentClass),子类也无法访问父匿名类的protected属性(因匿名类不是可继承的“父类”,此处 protected 实际仅起文档/约束作用) - 注意:匿名类本身无法被其他类继承,所以
protected在匿名类中语义弱化,仅对内部方法有意义
匿名类不支持动态属性(除非关闭 strict 模式)
PHP 8.2+ 默认禁止动态添加属性,而匿名类也受此限制。即使声明了 public 属性,也不能在实例化后随意追加新属性:
$obj = new class { public $a = 1; };-
$obj->b = 2;→ 若类未标记为#[\AllowDynamicProperties]或 PHP Cannot add dynamic property - 推荐做法:所有需要的属性都在匿名类定义时明确声明
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











