先上一段简单的代码:
<?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
时间: 2024-10-11 22:19:41