zoukankan      html  css  js  c++  java
  • 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 鼠标设备
    
    */
  • 相关阅读:
    读写分离
    java并发集合知识点(二)
    jdbc框架有很多,包括spring jdbc
    多线程,势必涉及到共享对象读写问题
    &lt;xliff:g&gt;标签
    租赁市场的上海方(浦东/张江)
    HDU 3488Tour(流的最小费用网络流)
    sql使用存储过程和交易
    状态压缩动态规划 -- 骨牌
    Android-2手机应用程序,短信应用
  • 原文地址:https://www.cnblogs.com/qingsong/p/13177026.html
Copyright © 2011-2022 走看看