PHP 新增匿名類

yourself發表於2018-03-15

php 新增匿名類

  • 直接上程式碼:

// PHP 7 之前的程式碼
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}

$util->setLogger(new Logger());

// 使用了 PHP 7+ 後的程式碼
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});
  • 可以傳遞引數到匿名類的構造器,也可以擴充套件(extend)其他類、實現介面(implement interface),以及像其他普通的類一樣使用 trait:

class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}

var_dump(new class(10) extends SomeClass implements SomeInterface {
    private $num;

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

    use SomeTrait;
});
  • 匿名類被巢狀進普通 Class 後,不能訪問這個外部類(Outer class)的 private(私有)、protected(受保護)方法或者屬性。
  • 訪問外部類(Outer class)protected 屬性或方法,匿名類可以 extend(擴充套件)此外部類。
  • 使用外部類(Outer class)的 private 屬性,必須通過構造器傳進來:
    class Outer
    {
        private $prop = 1;
        protected $prop2 = 2;

        protected function func1()
        {
            return 3;
        }

        public function func2()
        {
            return new class($this->prop) extends Outer {
                private $prop3;

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

                public function func3()
                {
                    return $this->prop2 + $this->prop3 + $this->func1();
                }
            };
        }
    }

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

獲取更多資訊

相關文章