7.0 版的发布是 PHP 语言发展过程中的一个重要里程碑,当时引入了许多新功能。匿名(Anonymous )类的功能在 PHP 7.0 版中也可用。
正如 “匿名(Anonymous )” 所暗示的那样,它是一个没有(程序员声明的)名称的类。通常的做法是使用某个标识符定义一个类,以便可以重复使用。另一方面,匿名类仅供一次性使用。
$obj = new class() {
/* 类代码 */
};
除了这个类没有名称之外,它类似于普通的命名类,从某种意义上说,它可以包含属性和方法。它的功能与命名类的对象的功能没有什么不同。
匿名类可以用于命名类,尤其是当该类不需要记录,并且该类在执行期间只使用一次时。当需要创建简单的一次性对象时,匿名类非常有用。
例子
在下面的代码中,一个匿名类被实例化并存储在 $obj 对象中。该类包括 addition() 和 division() 方法的定义,这些方法使用 $obj 对象调用。
<?php
$obj = new class(10) {
private int $x;
function __construct($x) {
$this->x = $x;
}
public function addition($x) {
return $this->x+$x;
}
public function division($x) {
return $this->x/$x;
}
};
echo "增加: " . $obj->addition(20) . PHP_EOL;
echo "部门: " . $obj->division(20) . PHP_EOL;
?>
将产生以下输出 -
增加: 30
部门: 0.5
部门: 0.5
作为子类的匿名类
匿名类可以做普通类可以做的所有事情。它可以扩展另一个类,实现一个接口,甚至使用一个 trait。
例子
在下面的示例中,匿名类是一个子类,扩展了已经可用的父类。
<?php
class myclass {
public function hello() {
echo "Hello World!" . PHP_EOL;
}
}
$obj = new class("Neena") extends myclass {
private string $nm;
function __construct($x) {
$this->nm = $x;
}
public function greeting() {
parent::hello();
echo "Welcome " . $this->nm . PHP_EOL;
}
};
$obj->greeting();
?>
将产生以下输出 -
Hello World!
Welcome Neena
Welcome Neena
例子
虽然匿名类没有任何用户定义的名称,但 PHP 确实为其分配了一个内部名称,该名称可以通过内置的 get_class() 函数获得,如下所示 -
<?php
$obj = new class() {
function greeting() {
echo "Hello World" . PHP_EOL;
}
};
$obj->greeting();
echo "Name of class: " . get_class($obj);
?>
将产生以下输出 -
Hello World
Name of class: class@anonymousC:\xampp\htdocs\hello.php:2$0
Name of class: class@anonymousC:\xampp\htdocs\hello.php:2$0
PHP 解析器随机分配内部名称。