PHP7中匿名类的使用方法
更新时间:2023-10-23什么是匿名类
在 PHP 7 之前,我们在使用对象时,都需要先定义类并实例化对象。但有时候我们希望仅使用一次的类可以直接被创建且不需要命名,这时候就需要用到 PHP 中的匿名类。
class Person {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
$person = new Person("Tom");
echo $person->getName(); // 输出 "Tom"
上面的代码中,我们创建了一个名为 Person 的类,并通过 new 关键字实例化为 $person 对象,并输出其名字。这是一个比较普遍的做法。
匿名类的使用方法
我们也可以通过匿名类来实现同样的功能:
$person = new class("Tom") {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
};
echo $person->getName(); // 输出 "Tom"
上面的代码中,我们使用了 new class 关键字,其后立即跟上类的定义。这个定义没有名字,所以我们称之为匿名类。我们可以在匿名类里面使用和定义变量、方法、继承和接口等等,和正常的类一样。同时,还可以通过闭包的方式引用外部变量:
$name = "Tom";
$person = new class($name) {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
};
echo $person->getName(); // 输出 "Tom"
匿名类的继承
匿名类也可以继承其他类:
class Person {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
$person = new class("Tom") extends Person {
public function getNameInUpperCase() {
return strtoupper($this->getName());
}
};
echo $person->getName(); // 输出 "Tom"
echo $person->getNameInUpperCase(); // 输出 "TOM"
上面的代码中,我们创建了一个名为 Person 的类,并通过 new class 关键字实例化了一个继承了 Person 的匿名类 $person。我们还定义了一个新方法 getNameInUpperCase,可以返回名字的大写形式。调用该方法可以得到正确的输出。
匿名类实现接口
匿名类还可以实现接口:
interface IPerson {
public function getName();
}
$person = new class("Tom") implements IPerson {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
};
echo $person->getName(); // 输出 "Tom"
上面的代码中,我们创建了一个名为 IPerson 的接口,并通过 new class 关键字实例化了一个匿名类 $person,实现了 IPerson 接口。调用 $person->getName() 方法可以正确输出名字。