c语言编程笔录

首页 >   > 笔记大全

笔记大全

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() 方法可以正确输出名字。