PHP匿名類
阿新 • • 發佈:2018-11-04
PHP從7開始支援匿名類,通常匿名類用來建立一次性的簡單物件,匿名類可以繼承其他類、實現介面、使用trait,還可以向其建構函式傳遞引數。
<?php class A{ public function fa(){ echo "a\n"; } } interface B{ public function fb(); } trait C{ function fc(){ echo "c\n"; } } function test($obj){ var_dump($obj); echo get_class($obj)."\n"; $obj->fa(); $obj->fb(); $obj->fc(); } test(new class("anonymous") extends A implements B{ use C; private $var; public function __construct($arg){ $this->var=$arg; } public function fb(){ echo "b\n"; echo $this->showProperty(); } function showProperty(){ echo "var=$this->var\n"; } }); ?>
匿名類被巢狀進普通Class後,不能訪問這個外部類的 private、protected方法或者屬性。通過繼承這個外部類可以訪問外部類protected的屬性和方法,通過構造引數將private屬性傳遞進匿名類就可以使用外部類的private屬性了。宣告的同一個匿名類,所建立的物件都是這個類的例項。
<?php class Outer{ protected $var="a"; private $var2="a2"; protected function foo(){ echo "foo\n"; } private function bar(){ echo "bar\n"; } public function getInner(){ return new class($this->var2) extends Outer{ private $var3; public function __construct($arg) { $this->var3 = $arg; } function foo2(){ $this->foo(); echo "$this->var,$this->var3\n"; } }; } } (new Outer)->getInner()->foo2(); var_dump(get_class((new Outer)->getInner())===get_class((new Outer)->getInner())); ?>