php的匿名类的使用

  匿名类是在声明类的同时创建出一个实例对象,将声明类和创建对象这两个步骤合在一起完成,所以一个匿名类就只能创建这一次对象。PHP支持通过new class 来实例化一个匿名类。当然匿名类和普通类一样,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用Trait。匿名类还可以在一个类的内部方法中声明,当匿名类被嵌套进普通类后,不能访问这个外部类的private、protected方法或者属性。为了访问外部类protected属性或方法,匿名类可以继承此外部类。为了使用外部类的private属性,必须通过构造器传进来。

<?php

class Outer{
    private $prop1 = 1;
    protected $prop2 = 2;
    
    protected function func1(){
        return 3;
    }
    
    public function func2(){
        
        /**
         * 匿名类访问外部类的权限是 public,通过继承外部类访问protected,
         * 对于私有的 private 只能通过构造器传入匿名类中
         */
        return new class($this->prop1) extends Outer{
            private $prop3;
            
            function __construct($prop){
                $this->prop3 = $prop;
            }
            
            public function func3(){
                
                //通过 $this->prop2 和 $this->func1() 访问外部类的属性和方法
                return $this->prop3 + $this->prop2 + $this->func1();
            }
        };
    }
}

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

//输出:6
<?php

//匿名类在多态的应用中比较常见,如下所示
interface USB{
    function run();
}

class Computer{
    function useUSB(USB $usb){
        $usb->run();
    }
}

$computer = new Computer;

$computer->useUSB(new class("键盘") implements USB{
    private $name ="";
    
    function __construct($name){
        $this->name = $name;
    }
    
    function run(){
        echo "运行 USB {$this->name}设备<br>";
    }
});

$computer->useUSB(new class("鼠标") implements USB{
    private $name ="";
    
    function __construct($name){
        $this->name = $name;
    }
    
    function run(){
        echo "运行 USB {$this->name}设备<br>";
    }
});

/*
执行结果:

运行 USB 键盘设备
运行 USB 鼠标设备

*/

猜你喜欢

转载自www.cnblogs.com/qingsong/p/13177026.html
今日推荐