专栏首页硬核项目经理的专栏优雅地创建未定义类PHP对象

优雅地创建未定义类PHP对象

优雅地创建未定义类PHP对象

在PHP中,如果没有事先准备好类,需要创建一个未定义类的对象,我们可以采用下面三种方式:

  • new stdClass()
  • new class{}
  • (object)[]

首先是stdClass,这个类是一个空的类模板,是PHP的内部保留关键字及类名。可以把它相像成是Java中的Object基类,在Java中,所有类都天然继承自Object基类。而PHP中的这个stdClass则是完全的一个空的类模板。你自己新创建的类并不是它的子类。但是用这个类模板可以创建一个自己未定义类的对象。当然,这个对象内部没有任何东西。

1$a = new stdClass();
2var_dump($a);

new class{}呢?做过一段时间开发,接触过前端js和其他动态语言的应该能猜到,这个是匿名类。一般在参数对象中很常见。它创建出来的对象是可以带属性方法的。

1$b = new class{
2    public $p = 1;
3};
4var_dump($b);

最后我们来看到的是使用数组强转成对象的形式来生成一个对象。

1$c = (object)[
2    'p' => 1
3];
4var_dump($c);

很明显,数组强转的形式生成的对象和第一种对象是一个类型的,而且它可以带属性也可以不带。但是,它不能带方法。

数组强转方式生成的对象非常的直观好理解。如果只是属性对象的封装,使用这种方式会更加地优雅舒服。复杂的对象生成可以使用匿名类的方式进行生成。而一些仅需要占位的对象,可以使用stdClass的方法,当然用空数组的方式也很方便。

需要注意的是,数组强转需要遵守类型转换的规则。比如数字下标的问题。

在日常开发中,我们对于一些接口或者数据库ORM框架的使用中会经常用这些功能。比如一些ORM框架的插入、修改需要传入的是只包含属性的对象。这时候就可以使用上述的方法灵活地生成对象而不用完整的定义类模板了。

测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/%E4%BC%98%E9%9B%85%E5%9C%B0%E5%88%9B%E5%BB%BA%E6%9C%AA%E5%AE%9A%E4%B9%89PHP%E5%AF%B9%E8%B1%A1.php

参考资料: https://www.php.net/manual/zh/language.types.object.php#117149

本文分享自微信公众号 - 硬核项目经理(fullstackpm)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MyEclipse10破解安装及Java环境基本配置

    首先安装及配置JDK环境,主要分为如下步骤:安装JDK-配置环境变量-检查是否安装成功。

    ITester软件测试小栈
  • 你编写的Java代码是咋跑起来的?

    如果你是一名 Java 开发人员,你肯定指定 Java 代码有很多种不同的运行方式。比如说可以在开发工具(IDEA、Eclipse等)中运行,可以双击执行 ja...

    武培轩
  • Servlet 会话

    在网络的七层模型中,会话层位于传输层之上,它定义如何开始、控制和结束一个会话。七层模式目前仅仅处于理论阶段,但是Web中借鉴了其中的一些思路。在Web中浏览器第...

    Masimaro
  • Spring Boot 2.2.0 发布,性能提升、支持 Java 13

    Spring Boot 2.2.0 正式发布了,可从 repo.spring.io 或是 Maven Central 获取。

    芋道源码
  • Java自动化测试框架-05 - 来给你的测试报告化个妆整个形 - (上)(详细教程)

      前边通过宏哥的讲解和分享想必小伙伴们和童鞋们都已经见过testng框架生成的测试报告,是不是它的样子和长相实在是不敢让大家伙恭维。那么今天宏哥就当一回美容师...

    北京-宏哥
  • SSH框架电子商城-系统技术分析

    SSH即Struts+Spring+Hibernate,是典型的J2EE三层结构,分为表现层、中间层和数据访问层。三层体系将数据表现、业务逻辑和数据访问分开。业...

    ITester软件测试小栈
  • 消息队列中间件(三)Kafka 入门指南

    Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成...

    未读代码
  • 腾讯云服务器Linux系统--安装Oracle JDK

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    营器
  • Java 中的锁原理、锁优化、CAS、AQS 详解!

    结论:如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

    芋道源码
  • 介绍下 Set、Map、WeakSet 和 WeakMap 的区别?

    向 Set 加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equ...

    Javanx

扫码关注云+社区

领取腾讯云代金券