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 鼠标设备
    
    */
  • 相关阅读:
    JVM(一)--Java内存区域
    leetcode33 搜索旋转排序数组
    二叉树的相关算法(一)
    分别求二叉树前、中、后序的第k个节点
    【蓝桥杯】历届试题 买不到的数目
    JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
    【蓝桥杯】核桃的数量
    Java内存分析之对象实例化操作初步分析
    【蓝桥杯】算法训练 K好数
    【蓝桥杯】基础练习试题
  • 原文地址:https://www.cnblogs.com/qingsong/p/13177026.html
Copyright © 2011-2022 走看看