PHP匿名类的用法

PHP匿名类的用法

在PHP7之后,PHP中加入了匿名类的特性。匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便。我们先来看看匿名类的简单使用。

// 直接定义
$objA = new class

{
public function getName()
{
echo "I'm objA";
}
};
$objA->getName();

// 方法中返回
function testA()
{
return new class

{
public function getName()
{
echo "I'm testA's obj";
}
};
}

$objB = testA();
$objB->getName();

// 作为参数
function testB($testBobj)
{
echo $testBobj->getName();
}
testB(new class{
public function getName()
{
echo "I'm testB's obj";
}
});

一次性给出了三种匿名类的使用方法。匿名类可以直接定义给变量,可以在方法中使用return返回,也可以当做参数传递给方法内部。其实,匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。

// 继承、接口、访问控制等
class A
{
public $propA = 'A';
public function getProp()
{
echo $this->propA;
}
}
trait B
{
public function getName()
{
echo 'trait B';
}
}
interface C
{
public function show();
}
$p4 = 'b4';
$objC = new class($p4) extends A implements C
{
use B;
private $prop1 = 'b1';
protected $prop2 = 'b2';
public $prop3 = 'b3';

public function __construct($prop4)
{
echo $prop4;
}

public function getProp()
{
parent::getProp();
echo $this->prop1, '===', $this->prop2, '===', $this->prop3, '===', $this->propA;
$this->getName();
$this->show();
}
public function show()
{
echo 'show';
}
};

$objC->getProp();

匿名类和普通类一样,可以继承其他类,可以实现接口,当然也包括各种访问控制的能力。也就是说,匿名类在使用方面和普通类并没有什么不同。但如果用get_class()获取类名将是系统自动生成的类名。相同的匿名类返回的名称当然也是相同的。

// 匿名类的名称是通过引擎赋予的
var_dump(get_class($objC));

// 声明的同一个匿名类,所创建的对象都是这个类的实例
var_dump(get_class(testA()) == get_class(testA()));

那么匿名类中的静态成员呢?当然也和普通类一样,静态成员是属于类而不是实例的。

// 静态变量
function testD()
{
return new class{
public static $name;
};
}
$objD1 = testD();
$objD1::$name = 'objD1';

$objD2 = testD();
$objD2::$name = 'objD2';

echo $objD1::$name;

当类中的静态变量修改时,所有类实例的这个静态变量都会跟着变化。这也是普通类静态成员的特性。

测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E5%8C%BF%E5%90%8D%E7%B1%BB%E7%9A%84%E7%94%A8%E6%B3%95.php

参考文档:https://www.php.net/manual/zh/language.oop5.anonymous.php

(0)

相关推荐

  • PHP中命名空间是怎样的存在(一)?

    命名空间其实早在PHP5.3就已经出现了.不过大部分同学可能在各种框架的使用中才会接触到命名空间的内容,当然,现代化的开发也都离不开这些能够快速产出的框架.这次我们不从框架的角度,仅从简单的代码角度来 ...

  • final关键字在PHP中的使用

    final关键字的使用非常简单,在PHP中的最主要作用是定义不可重写的方法.什么叫不可重写的方法呢?就是子类继承后也不能重新再定义这个同名的方法. class A { final function t ...

  • PHP方法参数的那点事儿

    在所有的编程语言中,方法或者函数,都可以传递一些参数进来进行业务逻辑的处理或者计算.这没什么可说的,但是在PHP中,方法的参数还有许多非常有意思的能力,下面我们就来说说这方面的内容. 引用参数 涉及到 ...

  • [PHP小课堂]PHP匿名类的用法

    [PHP小课堂]PHP匿名类的用法 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 B站ID:4 ...

  • 初中英语9类代词用法汇总(附例句)

    代词的分类:人称代词.物主代词.反身代词.指示代词.关系代词.疑问代词.连接代词和不定代词等. 1.人称代词:人称代词代替人和事物的名称,分为主格和宾格两种形式. (1)主格用来作句子的主语.表语. ...

  • 一遇到心律失常就犯难?一表总结四大类药物用法!

    一提起心律失常,为什么临床的你就头痛不已? 教材内容零散.书本实践分离.缺少临床经验--可能是 90% 的心内科医生都要面临的难点! 别慌,先来看看四大类抗心律失常的药物分类

  • 高中英语九类介词用法辨析

    高中英语九类介词用法辨析

  • 一文掌握骨质疏松治疗3大类药物用法用量及不良反应

    *仅供医学专业人士阅读参考 骨质疏松治疗药有哪些区别,使用药物治疗时又有哪些技巧呢?干货全在这里! 骨质疏松药物治疗,就是通过药物达到治疗目的,预防骨折. 骨质疏松治疗药分为三个类别:骨吸收抑制剂.骨 ...

  • 对于他汀类药物用法用量全面指南

    他汀类药物可降低冠心病的发病率和死亡率,减慢动脉粥样硬化斑块的发展,甚至使斑块消退,从而打破了冠心病不可逆转的传统观念. 但随着他汀类药物的广泛使用其可能产生的弊端也浮出水面.由于他汀类与较多药物存在 ...

  • 这九类介词用法辨析,中考英语必考(附固定搭配)

    高中英语学习帮 3篇原创内容 公众号 介词在中考英语中是必考知识点,同时也是同学们掌握最弱.最易出错的点.今天,小编跟大家分享中考英语必考的九类介词用法辨析,仔细看一看,相信这些总结会让你再做介词题目 ...

  • 表格常用的 9 类公式用法……我们帮你整理了最全合集!

    日常工作中,难免会和表格打交道,若能熟练使用各种表格公式,便能更高效地完成工作. 所以,WPS君今天整理了 9 大类 21 个表格常用公式!一起来看看吧~ 01 求和公式 1.多表相同位置求和(SUM ...

  • 语法精讲 | 英语9类代词用法 例句汇总,附真题练习讲解

    代词的分类:人称代词.物主代词.反身代词.指示代词.关系代词.疑问代词.连接代词.不定代词和相互代词等. 1. 人称代词:人称代词代替人或事物的名称,分为主格和宾格两种形式. 第一人 称单数 第二人 ...