在 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