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解析器隨機分配內部名稱。

廣告