由浅入深掌握匿名类

先上一段简单的代码:

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

时间: 2024-10-11 22:19:41

由浅入深掌握匿名类的相关文章

JAVA8 in Action:行为参数化,匿名类及lambda表达式的初步认知实例整理

import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; /** * Created by Administrator on 2017/8/19 0013. */ public class Test { /*************************************JAVA8 in Action:行为参数化,匿名类及

内部类与匿名类(转)

Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一下方法的不就行了吗? 的确,以此作为设计内部类的理由,实在没有说服力.真正的原因是这样的,java 中的内部类和接口

MVC匿名类传值学习

刚接触MVC+EF框架不久,但一直很困惑的就是控制器能否及如何向视图传递匿名类数据.宝宝表示很讨厌去新建实体类啦,查询稍有不同就去建一个实体类不是很麻烦吗,故趁阳光正好,周末睡到自然醒后起来尝试了之前一直在博客园看到的实现方式:英明神武的Tuple类,第一次对微软钦佩之至.故做如下记录,方便自己之后使用.大神就勿喷我啦,宝宝第一次写博客. 首先先描述一下我要实现的功能:从控制器后台查询一些数据,通过匿名类存储,在视图前端遍历输出.初衷实现流程如下: 控制器部分: 1 2 3 4 5 6 7 8

Java中的内部类、匿名类的使用

代码(test.java): 1 interface ie{ 2 public void print(); 3 } 4 5 class outer{} 6 7 public class test{ 8 public class inner{} 9 public void test(ie e){ 10 e.print(); 11 } 12 public static void main(String[] args){ 13 14 15 new test().test(new ie(){ 16 pu

解决内存泄漏更加清楚的认识到Java匿名类与外部类的关系

1.事件起因 在做项目的时候,通过Android Studio的Memory Monitor窗口观察程序内存使用情况,发现当程序退出的时候,有一部分应该释放掉的内存没有释放掉,知道程序中应该有内存泄漏了.为了发现程序中的内存泄漏,我切换了IDE工具到Eclipse,里面安装了内存泄漏的分析工具MAT,具体怎么用MAT分析内存泄漏可以自己Google,我把我自己找到内存泄漏的地方贴出来 从上图中可以看到,有24M左右的内存被mView(其实它真正是一个Fragment)这个变量持有,导致Java垃

Java匿名类

public class Person { public void hello() { System.out.println("我是Person"); } } 1 public class Main 2 { 3 /** 4 * 主函数,程序的入口 5 * @param args 6 */ 7 public static void main(String[] args) 8 { 9 final int num=90;//局部变量 10 11 //匿名类 12 Person p1=new

JAVA学习--匿名类的使用

1 public class TestProduct { 2 public static void main(String[] args) { 3 TestProduct t = new TestProduct(); 4 //方式一:创建一个实现Product接口的类的对象,并将此对象传入方法中 5 NoteBook n = new NoteBook(); 6 t.show(n); 7 //方式二:创建一个实现Product接口的匿名类的对象 8 Product p = new Product(

java匿名类和匿名对象及this的其他用法

/* 匿名内部类:就是内部类的简写格式. 必须前提:内部类必须继承或者实现一个类或者接口. 匿名内部类其实就是一个匿名 子类对象. 格式:new 父类对象 or 接口(){ 子类内容:(覆盖父类的, 而且可以增加自己的方法) }//相当于将 继承父类 和 new 的过程 写到了一起有某有!很方便有某有! */ class Outer{ int num; public Outer(){ num = 5; } class Inner{ int num; public Inner(){ num = 1

【转 Java 中的内部类和匿名类

 Java 中的内部类和匿名类 2008-10-16 13:47:41 标签:Java 内部类 匿名类 休闲 职场 Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一