如何在PHP中定义一个空对象

与一个新的arrays我这样做:

$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。

我想指出的是,在PHP中没有像空的对象那样的东西:

 $obj = new stdClass(); var_dump(empty($obj)); // bool(false) 

但是当然$ obj将是空的。

另一方面,在这两种情况下,空数组表示空

 $arr = array(); var_dump(empty($arr)); 

引用changelog函数为空

没有属性的对象不再被认为是空的。

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

 $oVal = new stdClass(); 

但是,PHP> = 5.4,我个人更喜欢使用:

 $oVal = (object)[]; 

它更短,我个人认为它更清晰,因为stdClass可能会误导新手程序员(即“嘿,我想要一个对象,而不是一个类!”)。

与PHP <5.4相同的是:

 $oVal = (object) array(); 

(object)[]相当于new stdClass()

查看PHP手册( 这里 ):

stdClass :通过types转换为对象创build。

和( 这里 ):

如果一个对象被转换成一个对象,它不会被修改。 如果任何其他types的值被转换为对象, 则会创build一个stdClass内置类的新实例


但是请记住, 空($ oVal)返回false ,因为@PaulP说:

没有属性的对象不再被认为是空的。

关于你的例子,如果你写:

 $oVal = new stdClass(); $oVal->key1->var1 = "something"; // PHP creates a Warning here $oVal->key1->var2 = "something else"; 

PHP创build下面的警告,隐式地创build属性key1 (一个对象本身)

警告:从空值创build默认对象

如果您的configuration(请参阅错误报告级别 )向浏览器显示此警告,则可能会出现问题。 这是另一个完整的主题,但是一个快速和肮脏的方法可能是使用错误控制运算符(@)来忽略警告:

 $oVal = new stdClass(); @$oVal->key1->var1 = "something"; // the warning is ignored thanks to @ $oVal->key1->var2 = "something else"; 

php.net说这是最好的:

 $new_empty_object = new stdClass(); 

我非常喜欢在JavaScript中创build匿名types的对象:

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

所以我总是试图用PHP编写这样的对象, 就像javascript一样

 //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你可以find一些有趣的惊喜 ,但在大多数情况下工作正常。

除了zombat的答案,如果你一直忘记stdClass

  function object(){ return new stdClass(); } 

现在你可以做:

 $str=''; $array=array(); $object=object(); 

你可以使用new stdClass() (推荐):

 $obj_a = new stdClass(); $obj_a->name = "John"; print_r($obj_a); // outputs: // stdClass Object ( [name] => John ) 

或者你可以将一个空的数组转换成一个产生stdClass内build类的新的空实例的对象:

 $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 ) 

以类似的方式访问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}; 

正如其他人指出的,你可以使用stdClass。 但是我认为没有()就更清洁了,就像这样:

 $obj = new stdClass; 

然而基于这个问题,看起来你真正想要的是能够dynamic添加属性到对象。 尽pipe你可以,你不需要使用stdClass。 真的,你可以使用任何类。 只要创build任何类的对象实例,并开始设置属性。 我喜欢创build自己的类,它的名字很简单,有一些基本的扩展function,我喜欢在这些情况下使用,很适合从其他类扩展。 基本上它是我自己的基础对象类。 我也喜欢有一个名为o()的函数。 像这样:

 class o { // some custom shared magic, constructor, properties, or methods here } function o() { return new o; } 

如果你不喜欢拥有自己的基础对象types,你可以简单的让o()返回一个新的stdClass。 一个好处是,o比stdClass更容易记住,并且更短,不pipe你是否使用它作为类名,函数名,或者两者兼而有之。 即使你的class级里没有任何代码,但比起笨拙的大写和命名的stdClass(这可能会引起“性传播疾病”的想法),记忆仍然更容易。 如果您自定义o类,则可能会findo()函数的用法,而不是构造函数语法。 这是一个正常的函数,返回的值比构造函数更less。 例如,函数名称可以作为string传递给接受可调用参数的函数。 一个函数也支持链接。 所以你可以这样做:$ result = o($ internal_value) – > some_operation_or_conversion_on_this_value();

这对于构build其他语言层的基础“语言”来说是一个很好的开始,顶层是用完整的内部DSL编写的。 这与Lisp风格的开发类似,PHP支持的方式比大多数人意识到的要好。 我意识到这是一个问题的切线,但问题涉及到我认为是充分利用PHP的力量的基础。

如果你想用dynamic属性创build对象(如在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 

你也可以尝试这种方式。

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

输出:

 object(stdClass)#1 (0) { } 

我们可以简单地使用这个方法创build一个空对象:

 $object = new ObjectClass(); 

例如:

 class ObjectClass { // Something goes here } $object = new ObjectClass(); 

现在我们有一个variables$object ,它是一个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 = json_decode(json_encode([]), FALSE);