匿名类

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