在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

优雅地创建未定义类PHP对象的更多相关文章

  1. C++中如何定义类和对象?

    在C++语言中,对象的类型被称为类,类代表了某一批对象的共性和特征. 类是对象的抽象,而对象是类的具体实例.如同C中的结构体一样,我们要先定义一个结构体,再使用结构体去定义一个变量.同一个结构体可以定 ...

  2. 我所了解的关于JavaScript定义类和对象的几种方式

    原文:http://www.cnblogs.com/hongru/archive/2010/11/08/1871359.html 在说这个话题之前,我想先说几句题外话:最近偶然碰到有朋友问我“hois ...

  3. JavaScript定义类与对象的一些方法

    最近偶然碰到有朋友问我"hoisting"的问题.即在js里所有变量的声明都是置顶的,而赋值则是在之后发生的.可以看看这个例子: 1 var a = 'global'; 2 (fu ...

  4. javascript定义类或对象的方式

    本文介绍的几种定义类或对象的方式中,目前使用最广泛的是:混合的构造函数/原型方式.动态原型方式.不要单独使用经典的构造函数或原型方式. 工厂方式 构造器函数 原型方式 混合的构造函数/原型方式 动态原 ...

  5. 下面的程序段创建了BufferedReader类的对象in,以便读取本机c盘my文件夹下的文件1.txt。File构造函数中正确的路径和文件名的表示是( )。

    下面的程序段创建了BufferedReader类的对象in,以便读取本机c盘my文件夹下的文件1.txt.File构造函数中正确的路径和文件名的表示是(    ). ./表示当前项目的路径../表示当 ...

  6. java 面向对象(四十):反射(四)反射应用一:创建运行时类的对象

    1.代码举例Class<Person> clazz = Person.class; Person obj = clazz.newInstance();System.out.println( ...

  7. JAVA_基础反射创建运行时类的对象

    通过反射去创建对应的运行时类的对象 newInstance():调用此方法,创建对应的运行时类的对象.内部调用的是空参的构造器. 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参构 ...

  8. ECMAScript 定义类、对象

    使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 工厂方式 原始的方式 因为对象的属性可以在对象创建后动 ...

  9. javaScript中定义类或对象的五种方式

    第一种方式: 工厂方法 能创建并返回特定类型的对象的工厂函数(factory function). function createCar(sColor){ var oTempCar = new Obj ...

随机推荐

  1. awk-07-IO和printf语句

    IO语句 1.getline 2.getline var 把a文件的行,追加到b文件的结尾 把 a 文件的行替换 b 文件的指定字段 把 a 文件的行替换 b 文件的对应字段 3.command | ...

  2. Xilinx约束学习笔记(二)—— 定义时钟

    2. 定义时钟 2.1 关于时钟 为了获得最佳精度路径覆盖信息,必须正确定义时钟. 时钟要定义在时钟树的根 pin 或 port 上,称为 source point. 时钟的边缘应该由周期和波形进行组 ...

  3. uwp 的work project 的 取消闹钟

    private void initalAlarmHanle() { string cancelAlarm = "CancelAlarmEvent"; ConnectionManag ...

  4. py2neo学习记录

    py2neo 通用 # -*- coding: UTF-8 -*- from py2neo import Graph, Node, Relationship, walk, NodeMatcher, R ...

  5. ScheduledExecutorService中scheduleAtFixedRate方法与scheduleWithFixedDelay方法的区别

    ScheduledExecutorService中scheduleAtFixedRate方法与scheduleWithFixedDelay方法的区别 ScheduledThreadPoolExecut ...

  6. Go测试--子测试

    目录 简介 简单的例子 子测试命名规则 过滤筛选 子测试并发 总结 简介 简单的说,子测试提供一种在一个测试函数中执行多个测试的能力,比如原来有TestA.TestB和TestC三个测试函数,每个测试 ...

  7. Ajax的GET,POST方法传输数据和接收返回数据

    //首先创建一个Ajax对象 function ajaxFunction(){ var xmlHttp; try{ // Firefox, Opera 8.0+, Safari xmlHttp=new ...

  8. 阿里云服务器上部署java项目(安装jdk,tomcat)

    安装JDK a.执行下面的yum指令安装,无线配置环境变量. 1.yum -y update #首先更新一下YUM源2.yum list Java* ---------#列出所有的JDK 3.yum ...

  9. python json demo

    值得注意的一点是,list类型的数据可以用[2,3]的方式定义,如"b" import json jsonData = '{"a":1,"b" ...

  10. 利用Python快速绘制海报级别地图

    1 简介 基于Python中诸如matplotlib等功能丰富.自由度极高的绘图库,我们可以完成各种极富艺术感的可视化作品,关于这一点我在系列文章在模仿中精进数据可视化中已经带大家学习过很多案例了. ...