由浅入深掌握匿名类

 

先上一段简单的代码:

<?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

 

posted @ 2017-12-13 17:25  不该相遇在秋天  阅读(288)  评论(0编辑  收藏  举报