对于一个新数组,我这样做:
$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";
当前回答
如果你想创建一个具有动态属性的对象(如javascript),而不接收未定义属性的警告。
class stdClass {
public function __construct(array $arguments = array()) {
if (!empty($arguments)) {
foreach ($arguments as $property => $argument) {
if(is_numeric($property)):
$this->{$argument} = null;
else:
$this->{$property} = $argument;
endif;
}
}
}
public function __call($method, $arguments) {
$arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
if (isset($this->{$method}) && is_callable($this->{$method})) {
return call_user_func_array($this->{$method}, $arguments);
} else {
throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
}
}
public function __get($name){
if(property_exists($this, $name)):
return $this->{$name};
else:
return $this->{$name} = null;
endif;
}
public function __set($name, $value) {
$this->{$name} = $value;
}
}
$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value
$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null
其他回答
使用通用对象并将键值对映射到它。
$oVal = new stdClass();
$oVal->key = $value
或者将数组强制转换为对象
$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;
你可以使用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 )
如果你想创建一个具有动态属性的对象(如javascript),而不接收未定义属性的警告。
class stdClass {
public function __construct(array $arguments = array()) {
if (!empty($arguments)) {
foreach ($arguments as $property => $argument) {
if(is_numeric($property)):
$this->{$argument} = null;
else:
$this->{$property} = $argument;
endif;
}
}
}
public function __call($method, $arguments) {
$arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
if (isset($this->{$method}) && is_callable($this->{$method})) {
return call_user_func_array($this->{$method}, $arguments);
} else {
throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
}
}
public function __get($name){
if(property_exists($this, $name)):
return $this->{$name};
else:
return $this->{$name} = null;
endif;
}
public function __set($name, $value) {
$this->{$name} = $value;
}
}
$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value
$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null
简短的回答
$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",
],
];