如何在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);