如何在 PHP 中定义空对象
使用新数组,我这样做:
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
对象是否有类似的语法
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
使用新数组,我这样做:
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
对象是否有类似的语法
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
$x = new stdClass();
手册中的注释对此进行了最好的总结:
stdClass 是默认的 PHP 对象。stdClass 没有属性、方法或父级。它不支持魔术方法,也不实现任何接口。
将标量或数组转换为 Object 时,将获得 stdClass 的实例。只要需要通用对象实例,就可以使用 stdClass。
创建“空”对象的标准方法是:
$oVal = new stdClass();
但我个人更喜欢使用:
$oVal = (object)[];
它更短,我个人认为它更清晰,因为stdClass可能会误导新手程序员(即“嘿,我想要一个对象,而不是一个类!...).
(object)[]
等效于新的 stdClass()。
。
请参阅 PHP 手册(此处):
stdClass:通过对对象的类型转换而创建。
和这里:
如果将对象转换为对象,则不会对其进行修改。如果将任何其他类型的值转换为对象,则会创建 stdClass 内置类的新实例。
和这里(从 PHP 7.3.0 开始,导出一个对象,用以下命令强制转换数组):var_export()
(object)
现在,将 stdClass 对象导出为强制转换为对象的数组 ((object) array( ... )),而不是使用不存在的方法 stdClass::__setState()。实际效果是,现在stdClass是可导出的,生成的代码甚至可以在早期版本的PHP上工作。
但是请记住,空($oVal)返回false,正如@PaulP所说:
没有属性的对象不再被视为空。
关于你的例子,如果你写:
$oVal = new stdClass();
$oVal->key1->var1 = "something"; // this creates a warning with PHP < 8
// and a fatal error with PHP >=8
$oVal->key1->var2 = "something else";
PHP < 8 创建以下警告,隐式创建属性(对象本身)key1
警告:从空值创建默认对象
PHP >= 8 会创建以下错误:
致命错误:未捕获错误:未定义的常量“key1”
在我看来,你最好的选择是:
$oVal = (object)[
'key1' => (object)[
'var1' => "something",
'var2' => "something else",
],
];