对于一个新数组,我这样做:

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";

对象是否有类似的语法

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";

当前回答

创建“空”对象的标准方法是:

$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",
  ],
];

其他回答

你也可以试试这种方法。

<?php
     $obj = json_decode("{}"); 
     var_dump($obj);
?>

输出:

object(stdClass)#1 (0) { }

这里有一个迭代的例子:

<?php
$colors = (object)[];
$colors->red = "#F00";
$colors->slateblue = "#6A5ACD";
$colors->orange = "#FFA500";

foreach ($colors as $key => $value) : ?>
    <p style="background-color:<?= $value ?>">
        <?= $key ?> -> <?= $value ?>
    </p>
<?php endforeach; ?>

简短的回答

$myObj = new stdClass();

// OR 

$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

长回答

我喜欢在JavaScript中创建匿名类型的对象是多么容易:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value

所以我总是尝试像javascript一样在PHP中写这种对象:

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value

但由于这基本上是一个数组,你不能像js那样给属性赋匿名函数:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"

好吧,你可以这样做,但在我看来并不实用/干净:

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar

此外,使用这个语法您可以发现一些有趣的惊喜,但在大多数情况下都可以正常工作。

创建“空”对象的标准方法是:

$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中的数据 对于关联数组,只需使用{$var}语法。

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};