PHP - 匿名类



7.0版本的发布是PHP语言发展史上的一个重要里程碑,当时引入了许多新特性。匿名类特性也在PHP 7.0中可用。

顾名思义,“匿名”是指没有(程序员声明的)名称的类。通常的做法是使用某个标识符定义一个类,以便可以重复使用它。另一方面,匿名类仅供一次性使用。

$obj = new class() {
   /* class body */
};

除了这个类没有名称之外,它与普通的命名类相似,因为它可以包含属性和方法。它的功能与命名类的对象的功能没有什么不同。

尤其当不需要对类进行文档化,并且类在执行过程中只使用一次时,可以使用匿名类而不是命名类。当需要创建简单的、一次性的对象时,匿名类非常有用。

示例

在下面的代码中,一个匿名类被实例化并存储在$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 "Addition: " . $obj->addition(20) . PHP_EOL;
   echo "Division: " . $obj->division(20) . PHP_EOL;
?>

它将产生以下输出

Addition: 30
Division: 0.5

匿名类作为子类

匿名类可以做普通类可以做的任何事情。它可以扩展另一个类,实现一个接口,甚至使用一个特性。

示例

在下面的示例中,匿名类是一个子类,扩展了已存在的父类。

<?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

示例

尽管匿名类没有任何用户定义的名称,但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

PHP解析器随机分配内部名称。

广告