一个新的数组定义一个空对象我这样做:如何在PHP
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
是否有物体类似的语法
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
一个新的数组定义一个空对象我这样做:如何在PHP
$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();
一个comment in the manual总结得非常好:
stdClass的是默认的PHP对象。 stdClass的没有属性,方法或 母体。它不支持magic 方法,并且不实现接口。
当您将标量或数组转换为 对象时,会得到一个 stdClass的实例。每当你需要一个通用的对象 例如,您可以使用stdClass的 。
如果可以的话,我会多次投票,因为我一直在不停地查看这个答案,以提醒自己“stdClass”。 – 2011-08-11 04:47:13
很容易记住;只要想想艾滋病就是这样,即使你尝试,现在你也永远不会忘记。 – 2013-02-03 19:51:37
$ o =(object)NULL; - 如果一个对象被转换为一个对象,它不会被修改。如果任何其他类型的值被转换为对象,则会创建stdClass内置类的新实例。如果该值为NULL,则新实例将为空。数组转换为一个具有按键指定属性的对象,以及相应的值。对于任何其他值,名为标量的成员变量将包含该值。 – DDS 2013-10-02 21:15:37
php.net说,这是最好的:
$new_empty_object = new stdClass();
是的,这当然是推荐的方法。 – 2017-01-30 15:22:38
我想指出的是,PHP有像感空对象没有这样的事:
$obj = new stdClass();
var_dump(empty($obj)); // bool(false)
当然,但$ obj将是空的。
在另一方面空数组在这两种情况下是指从空更改日志功能empty
没有属性的对象不再被认为是空的
$arr = array(); var_dump(empty($arr));
报价。
你有这种坏,但有用的工艺:
$var = json_decode(json_encode([]), FALSE);
坏,坏,非常坏 – 2015-10-17 22:36:45
正如其他人所指出的那样,你可以使用stdClass的。不过,我认为这是没有的(),像这样清洁:
$obj = new stdClass;
但是基于这个问题,好像你真正想要的是能够将属性添加到物体的飞行。尽管你可以,你不需要使用stdClass。真的,你可以使用任何课程。只需创建任何类的对象实例并开始设置属性。我喜欢创建自己的类,它的名字很简单,有一些基本的扩展功能,我喜欢在这些情况下使用,并且适合从其他类扩展。基本上它是我自己的基础对象类。我也喜欢有一个名为o()的函数。像这样:
class o {
// some custom shared magic, constructor, properties, or methods here
}
function o() {
return new o;
}
如果你不喜欢有自己的基本对象类型,你可以简单地有O()返回一个新的stdClass的。一个优点是o是更容易比stdClass的记忆和较短,无论你使用它作为一个类名,函数名,或两者兼而有之。即使你没有你的O类中的任何代码,它仍然是更容易比笨拙资本和名为stdClass的(可调用“性病类”的想法)记忆。如果您自定义o类,则可能会找到o()函数的用法,而不是构造函数语法。这是一个正常的函数,它返回的值比构造函数的限制更少。例如,函数名称可以作为字符串传递给接受可调用参数的函数。一个函数也支持链接。所以你可以这样做: $ result = o($ internal_value) - > some_operation_or_conversion_on_this_value();
这对于构建其他语言层的基础“语言”来说是一个很好的开始,顶层使用完整的内部DSL编写。这与lisp风格的开发类似,PHP支持它比大多数人意识到的要好。我意识到这对于这个问题有点切题,但这个问题涉及到我认为是充分利用PHP的力量的基础。
除了zombat的答案,如果你不断地忘记stdClass
function object(){
return new stdClass();
}
现在你可以这样做:
$str='';
$array=array();
$object=object();
,以在类似的方式stdClass的访问数据,你做 与asociative阵列只使用{$ 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};
的标准方式创建一个 “空” 的对象是:
$oVal = new stdClass();
但是,随着PHP> = 5.4,我个人喜欢使用:
$oVal = (object)[];
这是更短,我个人认为它更清晰,因为stdClass可能会误导新手程序员(即“嘿,我想要一个对象,而不是课堂!“)。
用PHP < 5.4同样是:
$oVal = (object) array();
(object)[]
相当于new stdClass()
。
参见PHP手册(here):
stdClass的:创建者类型转换到对象。
和(here):
如果对象被转换为一个对象,它不被修改。如果任何其他类型的值被转换为对象,则将创建stdClass内置类的新实例。
但是请记住,空($椭圆形)返回false,为@PaulP说:
没有属性对象不再被认为是空的。
关于你提到的例子,如果你写:
$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates a Warning here
$oVal->key1->var2 = "something else";
PHP创建下列警告,隐式创建属性key1
(对象本身)
警告:从空创建默认对象值
这可能是一个问题,如果你的配置(见error reporting level)向浏览器显示此警告。这又是一个整体的问题,而是一个快速和肮脏的方法可以使用error control operator (@)忽略警告:
$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$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
您可以使用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)
或者您可以将null
值转换为一个对象,该对象会生成一个新的stdClass内置类的空实例:
$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);
// outputs:
// stdClass Object ([name] => John)
我的爱是多么简单的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
而且,利用此synthax你可以找到一些funny surprises,但能正常工作在大多数情况下。
你也可以尝试这种方式。
<?php
$obj = json_decode("{}");
var_dump($obj);
?>
输出:
$object = new ObjectClass();
例如:
class ObjectClass
{
// Something goes here
}
$object = new ObjectClass();
现在我们有可变$object
object(stdClass)#1 (0) { }
我们可以简单地使用这种方法创建一个空对象那是ObjectClass
,但是是空的。注意如果它包含功能__construct()
,那么它可能不是空的。
我知道这是一个古老的问题,但似乎有些人忘记了构造函数。
如果你不想这样做:
$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',
);
在这里与迭代的例子:
<?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; ?>
使用通用的对象和密钥值对映射到它。
$oVal = new stdClass();
$oVal->key = $value
或铸一个数组对象
$aVal = array('key'=>'value');
$oVal = (object) $aVal;
'$ VAR =(对象)(布尔)(串)(INT)(阵列)新一个StdClass;'你知道,只要是安全的。 – Xeoncross 2013-05-09 16:30:25
Google已将此问题标题编入索引:'阵列 - 如何在PHP中定义空对象“。与阵列无关 – 2017-02-09 19:35:10