匿名類

PHP 7 中引入了匿名類,可以輕鬆建立快速的一次性物件。它們可以採用建構函式引數,擴充套件其他類,實現介面,並像普通類一樣使用特徵。

在最基本的形式中,匿名類如下所示:

new class("constructor argument") {
    public function __construct($param) {
        var_dump($param);
    }
}; // string(20) "constructor argument"

將匿名類巢狀在另一個類中並不允許它訪問該外部類的私有或受保護方法或屬性。通過從匿名類擴充套件外部類,可以獲得對外部類的受保護方法和屬性的訪問。通過將它們傳遞給匿名類的建構函式,可以獲得對外部類的私有屬性的訪問。

例如:

class Outer {
    private $prop = 1;
    protected $prop2 = 2;

    protected function func1() {
        return 3;
    }

    public function func2() {
        // passing through the private $this->prop property
        return new class($this->prop) extends Outer {
            private $prop3;

            public function __construct($prop) {
                $this->prop3 = $prop;
            }

            public function func3() {
                // accessing the protected property Outer::$prop2
                // accessing the protected method Outer::func1()
                // accessing the local property self::$prop3 that was private from Outer::$prop
                return $this->prop2 + $this->func1() + $this->prop3;
            }
        };
    }
}

echo (new Outer)->func2()->func3(); // 6