PHP从7开始支持匿名类,通常匿名类用来创建一次性的简单对象,匿名类可以继承其他类、实现接口、使用trait,还可以向其构造函数传递参数。
<?php
class A{
public function fa(){
echo "a\n";
}
}
interface B{
public function fb();
}
trait C{
function fc(){
echo "c\n";
}
}
function test($obj){
var_dump($obj);
echo get_class($obj)."\n";
$obj->fa();
$obj->fb();
$obj->fc();
}
test(new class("anonymous") extends A implements B{
use C;
private $var;
public function __construct($arg){
$this->var=$arg;
}
public function fb(){
echo "b\n";
echo $this->showProperty();
}
function showProperty(){
echo "var=$this->var\n";
}
});
?>
匿名类被嵌套进普通Class后,不能访问这个外部类的 private、protected方法或者属性。通过继承这个外部类可以访问外部类protected的属性和方法,通过构造参数将private属性传递进匿名类就可以使用外部类的private属性了。声明的同一个匿名类,所创建的对象都是这个类的实例。
<?php
class Outer{
protected $var="a";
private $var2="a2";
protected function foo(){
echo "foo\n";
}
private function bar(){
echo "bar\n";
}
public function getInner(){
return new class($this->var2) extends Outer{
private $var3;
public function __construct($arg)
{
$this->var3 = $arg;
}
function foo2(){
$this->foo();
echo "$this->var,$this->var3\n";
}
};
}
}
(new Outer)->getInner()->foo2();
var_dump(get_class((new Outer)->getInner())===get_class((new Outer)->getInner()));
?>