[关闭]
@Chiang 2020-01-08T13:03:37.000000Z 字数 1410 阅读 552

匿名类

PHP


PHP 7 开始支持匿名类。 匿名类很有用,可以创建一次性的简单对象。

  1. <?php
  2. // PHP 7 之前的代码
  3. class Logger
  4. {
  5. public function log($msg)
  6. {
  7. echo $msg;
  8. }
  9. }
  10. $util->setLogger(new Logger());
  11. // 使用了 PHP 7+ 后的代码
  12. $util->setLogger(new class {
  13. public function log($msg)
  14. {
  15. echo $msg;
  16. }
  17. });

可以传递参数到匿名类的构造器,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用 trait:

  1. <?php
  2. class SomeClass {}
  3. interface SomeInterface {}
  4. trait SomeTrait {}
  5. var_dump(new class(10) extends SomeClass implements SomeInterface {
  6. private $num;
  7. public function __construct($num)
  8. {
  9. $this->num = $num;
  10. }
  11. use SomeTrait;
  12. });
  1. 以上例程会输出:
  2. object(class@anonymous)#1 (1) {
  3. ["Command line code0x104c5b612":"class@anonymous":private]=>
  4. int(10)
  5. }

匿名类被嵌套进普通 Class 后,不能访问这个外部类(Outer class)的 private(私有)、protected(受保护)方法或者属性。 为了访问外部类(Outer class)protected 属性或方法,匿名类可以 extend(扩展)此外部类。 为了使用外部类(Outer class)的 private 属性,必须通过构造器传进来:

  1. <?php
  2. class Outer
  3. {
  4. private $prop = 1;
  5. protected $prop2 = 2;
  6. protected function func1()
  7. {
  8. return 3;
  9. }
  10. public function func2()
  11. {
  12. return new class($this->prop) extends Outer {
  13. private $prop3;
  14. public function __construct($prop)
  15. {
  16. $this->prop3 = $prop;
  17. }
  18. public function func3()
  19. {
  20. return $this->prop2 + $this->prop3 + $this->func1();
  21. }
  22. };
  23. }
  24. }
  25. echo (new Outer)->func2()->func3();
  1. 以上例程会输出:
  2. 6

声明的同一个匿名类,所创建的对象都是这个类的实例。

  1. <?php
  2. function anonymous_class()
  3. {
  4. return new class {};
  5. }
  6. if (get_class(anonymous_class()) === get_class(anonymous_class())) {
  7. echo 'same class';
  8. } else {
  9. echo 'different class';
  10. }
  1. 以上例程会输出:
  2. same class

Note:
注意,匿名类的名称是通过引擎赋予的,如下例所示。 由于实现的细节,不应该去依赖这个类名。

  1. <?php
  2. echo get_class(new class {});
  1. 以上例程的输出类似于:
  2. class@anonymous/in/oNi1A0x7f8636ad2021
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注