先上一段简单的代码:
<?php
$name = new class(){
public function __construct()
{
$this->age = 18;
}
};
echo $name->age;
匿名类的声明和实例化是同时进行的,它具备其他类所具备的所有功能,差别在于它没有类名。
匿名类的一次性小任务代码流程对性能提升帮助很大。
虽然我们看到的匿名类是没有命名的,但在PHP内部,会在内存的引用地址表中为其分配一个全局唯一的名称,使用get_class()函数即可查看:
<?php
$name = new class(){
public function __construct()
{
echo get_class();
}
};
运行结果:
参数可以直接设置在匿名类中当作构造函数的参数:
<?php
function person($option)
{
return new class($option)
{
public function __construct($option)
{
foreach($option as $key => $val){
$this->$key = $val;
}
}
};
}
$one_person = person(['name'=>'zhangsan','sex'=>'男','age'=>12]);
echo "<pre>";
print_r($one_person);
echo "</pre>";
运行结果:
匿名类在继承方面与命名类相同,一样可以继承父类及父类的方法,以下代码为例:
<?php
class count
{
protected $result;
public function __construct()
{
echo '这是count的构造方法<br>';
}
public function getResult() : int
{
return $this->result;
}
}
$number = new class(10) extends count
{
public function __construct(int $n)
{
parent::__construct();
$this->result = $n;
}
};
echo $number->getResult();
y以上结果输出 ‘这是count的构造方法’ 和 10
匿名类还可以在别的类中嵌套使用:
<?php
class count
{
protected $a = 10;
protected $b = 20;
public function add() : float
{
return $this->a + $this->b;
}
public function getResult()
{
return new class() extends count
{
public function multiply(float $n) : float
{
return $this->add() * $n;
}
};
}
}
$count = new count();
echo $count->getResult()->multiply(2);
首先调用getResult()方法,返回一个匿名类创建的对象,而此对象继承了count类,因此它拥有两个方法,一个是父类的add() 一个是自身的multiply(),接着调用add()传入参数2,返回 ($this->$a + $this->$b) * 2 的计算结果
所以以上代码输出 60