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

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

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


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

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


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

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


$c = (object)[
'p' => 1
];
var_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

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

最新文章

  1. 美国在研新药_读取单个PDF
  2. weinre 简记
  3. 学习服务端JavaScript这个有名的Node.js
  4. [CentOs7]图形界面
  5. TAT 前端突击队 第四关 题目 腐蚀的画
  6. mysql无法启动 mysqld process already exists
  7. purge
  8. macOS apache配置及开启虚拟服务器的开启,apache开启重写模式
  9. 使用SevenZipSharp压缩/解压7z格式
  10. 【技术解密】SequoiaDB分布式存储原理
  11. Oracle联机日志损坏解决办法
  12. 【前端】Vue2全家桶案例《看漫画》之三、引入vuex
  13. python学习笔记-问题
  14. 【FAQ系列】关于SQL_Errno:1677导致主从复制中断的思考和实践
  15. Spring基础复习
  16. java代码之美(7)---guava之Bimap
  17. c++连续读取未知个数的数字
  18. DNN网络(三)python下用Tensorflow实现DNN网络以及Adagrad优化器
  19. 【剑指offer】求树中满足和为给定数字的路径
  20. Docker容器与容器云之Docker单机集群部署案例

热门文章

  1. Java JVM【笔记】
  2. Redis雪崩和Redis穿透
  3. 安鸾CTF Writeup wordpress 01
  4. DVWA(九):File Upload 全等级文件上传
  5. 000 PCI Express协议入门指南目录
  6. 单片机学习(八)点阵LED的使用
  7. C++11 shared_ptr(智能指针)详解
  8. 一 MongoDB入门
  9. rabbitMq可靠性投递之配置(消息至交换机,至队列不通的回调)
  10. DFS常规解题套路