匿名类和普通类一样,只是没有名字,它可以继承、实现接口、使用trait
,以及拥有自己的成员属性。
如果外部类中的方法返回了一个匿名类,那么在这个匿名类中并不能访问到外部类的私有成员和受保护的成员。
如果要在匿名类中访问外部类中受保护的成员,可以通过继承外部类。
如果要在匿名类中访问外部类中私有成员,可以给匿名类的构造函数传值。
简单的定义方式:
// 通过变量定义
$myClass = new class{
public function __construct(){
echo __class__;
}
};
// 输出:class@anonymousE:\wwwroot\php\index.php000001D83BB60076
更详细的描述:
// 抽象类
abstract class One{};
// 接口对象
interface Two{};
// Trait
trait Three{};
// 打印出一个匿名类的信息
var_dump(new class('我是构造函数的参数', '我是参数二号') extends One implements Two{
use Three;
public $name = "iGuoji";
const AGE = 26;
static $desc = "hello world";
public function __construct(string ...$args){
var_dump($args);
echo "<br />";
}
public function say(){
echo static::$desc;
}
});
通过同一个函数创建的匿名类得到的对象,它们将会是同一个类的实例。
// 通过函数返回匿名类
function newClass(){
return new class{};
}
// string(56) "class@anonymousE:\wwwroot\php\index.php000001D83BB6004F"
$c1 = newClass();
var_dump(get_class($c1));
// string(56) "class@anonymousE:\wwwroot\php\index.php000001D83BB6004F"
$c2 = newClass();
var_dump(get_class($c2));