匿名类是在声明类的同时创建出一个实例对象,将声明类和创建对象这两个步骤合在一起完成,所以一个匿名类就只能创建这一次对象。PHP支持通过new class 来实例化一个匿名类。当然匿名类和普通类一样,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用Trait。匿名类还可以在一个类的内部方法中声明,当匿名类被嵌套进普通类后,不能访问这个外部类的private、protected方法或者属性。为了访问外部类protected属性或方法,匿名类可以继承此外部类。为了使用外部类的private属性,必须通过构造器传进来。
<?php class Outer{ private $prop1 = 1; protected $prop2 = 2; protected function func1(){ return 3; } public function func2(){ /** * 匿名类访问外部类的权限是 public,通过继承外部类访问protected, * 对于私有的 private 只能通过构造器传入匿名类中 */ return new class($this->prop1) extends Outer{ private $prop3; function __construct($prop){ $this->prop3 = $prop; } public function func3(){ //通过 $this->prop2 和 $this->func1() 访问外部类的属性和方法 return $this->prop3 + $this->prop2 + $this->func1(); } }; } } echo (new Outer)->func2()->func3(); //输出:6
<?php //匿名类在多态的应用中比较常见,如下所示 interface USB{ function run(); } class Computer{ function useUSB(USB $usb){ $usb->run(); } } $computer = new Computer; $computer->useUSB(new class("键盘") implements USB{ private $name =""; function __construct($name){ $this->name = $name; } function run(){ echo "运行 USB {$this->name}设备<br>"; } }); $computer->useUSB(new class("鼠标") implements USB{ private $name =""; function __construct($name){ $this->name = $name; } function run(){ echo "运行 USB {$this->name}设备<br>"; } }); /* 执行结果: 运行 USB 键盘设备 运行 USB 鼠标设备 */