匿名类
匿名类支持在PHP 7添加。匿名类在创建简单的一次性对象时很有用.。
- <?php
- // Pre PHP 7 code
- class Logger
- {
- public function log ( $msg )
- {
- echo $msg ;
- }
- }
- $util -> setLogger (new Logger ());
- // PHP 7+ code
- $util -> setLogger (new class {
- public function log ( $msg )
- {
- echo $msg ;
- }
- });
他们可以通过参数传递给他们的构造函数,扩展其他类,实现接口,并使用特征,就像一个正常的类可以:
- <?php
- 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 ;
- });
- /**以上代码会输出:
- object(class@anonymous)#1 (1) {
- ["Command line code0x104c5b612":"class@anonymous":private]=>
- int(10)
- }
- **/
在另一个类中嵌套匿名类不允许它访问任何私有或受保护的类或外部类的属性.。为了使用外部类的受保护的属性或方法,匿名类可以扩展外部类.。若要使用匿名类中的外部类的私有属性或受保护属性,则必须通过其构造函数传递它们.:
- <?php
- 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