对于一个新数组,我这样做:
$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";
当前回答
你可以使用new stdClass()(这是推荐的):
$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);
// outputs:
// stdClass Object ( [name] => John )
或者你可以将一个空数组转换为一个对象,该对象会生成stdClass内置类的一个新的空实例:
$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);
// outputs:
// stdClass Object ( [name] => John )
或者你可以将空值转换为一个对象,该对象会生成stdClass内置类的一个新的空实例:
$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);
// outputs:
// stdClass Object ( [name] => John )
其他回答
如果你不想这样做:
$myObj = new stdClass();
$myObj->key_1 = 'Hello';
$myObj->key_2 = 'Dolly';
您可以使用以下其中之一:
PHP > = 5.4
$myObj = (object) [
'key_1' => 'Hello',
'key_3' => 'Dolly',
];
PHP < 5.4
$myObj = (object) array(
'key_1' => 'Hello',
'key_3' => 'Dolly',
);
$x = new stdClass();
手册中的一条评论总结得最好:
stdClass是默认的PHP对象。 stdClass没有属性,方法或 的父母。它不支持魔法 方法,并且没有实现接口。 将标量或数组强制转换为 对象的实例 stdClass。你可以使用stdClass 当你需要一个通用对象时 实例。
Php.net说它是最好的:
$new_empty_object = new stdClass();
创建“空”对象的标准方法是:
$oVal = new stdClass();
但我个人更喜欢用:
$oVal = (object)[];
它更短,我个人认为它更清楚,因为stdClass可能会误导新手程序员(例如。“嘿,我想要一个对象,不是一个类!”…)
(object)[]等价于new stdClass()。
请参阅PHP手册(此处):
stdClass:通过类型转换到对象创建。
在这里:
如果将对象转换为对象,则不修改该对象。如果将任何其他类型的值转换为对象,则会创建stdClass内置类的一个新实例。
这里(从PHP 7.3.0开始,var_export()导出一个使用(object)转换数组的对象):
现在将stdClass对象作为数组导出到对象((对象)数组(…)),而不是使用不存在的方法stdClass::__setState()。实际效果是现在stdClass是可导出的,生成的代码甚至可以在早期版本的PHP上工作。
但是请记住empty($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创建以下Warning,隐式创建属性key1(对象本身)
警告:从空值创建默认对象
PHP >= 8创建以下错误:
错误:未定义的常量“key1”
在我看来,你最好的选择是:
$oVal = (object)[
'key1' => (object)[
'var1' => "something",
'var2' => "something else",
],
];
stdClass是默认的PHP对象。stdClass没有属性、方法或父类。它不支持魔术方法,也不实现任何接口。
当您将标量或数组强制转换为Object时,您将获得stdClass的实例。只要需要泛型对象实例,就可以使用stdClass。
<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null; // same as above
$z = (object) 'a'; // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>
stdClass不是基类!PHP类不会自动继承任何类。所有的类都是独立的,除非它们显式地扩展另一个类。PHP在这方面不同于许多面向对象的语言。
<?php
// CTest does not derive from stdClass
class CTest {
public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass); // false
var_dump(is_subclass_of($t, 'stdClass')); // false
echo get_class($t) . "\n"; // 'CTest'
echo get_parent_class($t) . "\n"; // false (no parent)
?>
你不能在你的代码中定义一个名为stdClass的类。该名称已被系统使用。你可以定义一个名为“Object”的类。
您可以定义一个扩展stdClass的类,但是您不会得到任何好处,因为stdClass什么也不做。
(在PHP 5.2.8上测试)