PHP匿名类

1.可以创建一次性的简单对象

<?php
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}
$util = new stdClass();
$util->setLogger(new Logger());

$util->setLogger(new class{
   public function log($msg)
   {
       echo $msg;
   }
});

2.可以传递参数到匿名类的构造器,也可以扩展其他类,实现接口,以及像其他普通的类一样使用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;
});

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

class Outer
{
    private $prop = 1;
    protected $prop2 = 2;
    public  $a=1;
    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()
          {
//              echo $this->a; //错误
              return $this->prop2 + $this->prop3+$this->func1();
          }
        };
    }

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

*4.声明同一个匿名类,所创建的对象就是这个类的实例
注意,匿名类的名称是通过引擎赋予的。由于实现的细节,不应该去依赖这个类名

//var_dump( get_class(new class{}));

function anonymous_class()
{
    return new class{};
}

if (get_class(anonymous_class()) === get_class(anonymous_class()))
{
    echo "same class";
}else{
    echo "different class";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值