• 由浅入深掌握匿名类


    先上一段简单的代码:

    <?php
    
    $name = new class(){
        public function __construct()
        {
            $this->age = 18;
        }
    };
    
    echo $name->age;

    匿名类的声明和实例化是同时进行的,它具备其他类所具备的所有功能,差别在于它没有类名。

    匿名类的一次性小任务代码流程对性能提升帮助很大。

    虽然我们看到的匿名类是没有命名的,但在PHP内部,会在内存的引用地址表中为其分配一个全局唯一的名称,使用get_class()函数即可查看:

    <?php
    
    $name = new class(){
        public function __construct()
        {
            echo get_class();
        }
    };

    运行结果:

    参数可以直接设置在匿名类中当作构造函数的参数:

    <?php
    
    function person($option)
    {
        return new class($option)
        {
            public function __construct($option)
            {
                foreach($option as $key => $val){
                    $this->$key = $val;
                }
            }
        };
    }
    
    $one_person = person(['name'=>'zhangsan','sex'=>'男','age'=>12]);
    
    echo "<pre>";
    print_r($one_person);
    echo "</pre>";

    运行结果:

    匿名类在继承方面与命名类相同,一样可以继承父类及父类的方法,以下代码为例:

    <?php
    
    class count
    {
        protected $result;
        public function __construct()
        {
            echo '这是count的构造方法<br>';
        }
        public function getResult() : int
        {
            return $this->result;
        }
    }
    
    $number = new class(10) extends count
    {
        public function __construct(int $n)
        {
            parent::__construct();
            $this->result = $n;
        }
    };
    
    echo $number->getResult();

    y以上结果输出 ‘这是count的构造方法’  和 10

    匿名类还可以在别的类中嵌套使用:

    <?php
    
    class count
    {
        protected $a = 10;
        protected $b = 20;
    
        public function add() : float
        {
            return $this->a + $this->b;
        }
    
        public function getResult()
        {
            return new class() extends count
            {
                public function multiply(float $n) : float
                {
                    return $this->add() * $n;
                }
            };
        }
    }
    
    $count = new count();
    echo $count->getResult()->multiply(2);

    首先调用getResult()方法,返回一个匿名类创建的对象,而此对象继承了count类,因此它拥有两个方法,一个是父类的add() 一个是自身的multiply(),接着调用add()传入参数2,返回 ($this->$a + $this->$b) * 2  的计算结果

    所以以上代码输出 60

  • 相关阅读:
    求出123456 8910,数字,显示出来
    Django之Model操作
    AJAX全套
    Python之路【第十六篇】:Django【基础篇】
    Q2Day81
    Django第二重点(thml与django连接)
    react
    es6 和 python 语法比较
    微信
    py库: GUI(tkinter)
  • 原文地址:https://www.cnblogs.com/fengyumeng/p/8034004.html
Copyright © 2020-2023  润新知