PHP匿名類

2020-08-08 14:48:38
在 PHP 中,從 PHP7 開始支援匿名類的特性。匿名類就是指沒有名字的類,它們不能被參照。因爲匿名類沒有名字,所以一個匿名類就只能建立一次物件。

可以通過 new class 來建立一個匿名類,與普通類的定義相似,不同點就是不需要設定類名,如下所示:

new class(參數1, 參數2, ...){
    成員屬性和方法;
};

下面 下麪我們來看一個簡單的例子,如下所示:
<?php
    $name = new class('C語言中文網'){
        private $name;
        public function __construct($name){
            $this->name = $name;
        }
        public function output(){
            echo $this->name;
        }
    };
    $name->output();
?>
匿名類可以在一個類的內部方法中宣告,也可以直接賦值給變數。當匿名類被巢狀進普通類後,不能存取這個外部類中使用 private、protected 修飾的方法或者屬性。如果要存取外部類使用 protected 修飾的屬性或方法,可以使用匿名類來繼承此外部類。如果要使用外部類使用 private 修飾的屬性,則必須通過構造器傳進來。

和普通類一樣,匿名類不僅可以繼承其他類,還可以實現介面,以及像其他普通的類一樣使用 Trait。下面 下麪來看一個範例,如下所示:
<?php
    class Brwser{
        function open(Websit $url){
            $url->run();
        }
    }
    interface Websit{
        function run();
    }

    $chrome = new Brwser;
    $chrome -> open(new class('http://c.biancheng.net/php/', 'Chrome') implements Websit{
        private $url;
        private $name;
        function __construct($url, $name){
            $this->url = $url;
            $this->name = $name;
        }
        function run(){
            echo '在 '.$this->name.' 瀏覽器中開啓:'.$this->url.' <br>';
        }
    });

    $firefox = new Brwser;
    $chrome -> open(new class('http://c.biancheng.net/php/', 'Fire fox') implements Websit{
        private $url;
        private $name;
        function __construct($url, $name){
            $this->url = $url;
            $this->name = $name;
        }
        function run(){
            echo '在 '.$this->name.' 瀏覽器中開啓:'.$this->url.' <br>';
        }
    });
?>
執行結果如下:

在 Chrome 瀏覽器中開啓:http://c.biancheng.net/php/
在 Fire fox 瀏覽器中開啓:http://c.biancheng.net/php/

匿名類的宣告與使用是同時進行的,它具備其他類所具備的所有功能,差別在於匿名類沒有類名。雖然匿名類是沒有命名的,但在 PHP 內部,會在記憶體中爲其分配一個全域性唯一的名稱,例如“class@0x4f6a8d124”。可以使用 get_class() 函數來獲取這個系統自動生成的類名,如下所示:
<?php
    $name = new class('C語言中文網'){
        private $name;
        public function __construct($name){
            $this->name = $name;
        }
        public function output(){
            echo $this->name.'<br>';
        }
    };
    echo get_class($name);
?>
執行結果如下:

class@anonymousD:\WWW\index.php000001B4597500FD