2009-09-16 38 views
270

一个新的数组定义一个空对象我这样做:如何在PHP

$aVal = array(); 

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

是否有物体类似的语法

(object)$oVal = ""; 

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

'$ VAR =(对象)(布尔)(串)(INT)(阵列)新一个StdClass;'你知道,只要是安全的。 – Xeoncross 2013-05-09 16:30:25

+0

Google已将此问题标题编入索引:'阵列 - 如何在PHP中定义空对象“。与阵列无关 – 2017-02-09 19:35:10

回答

627
$x = new stdClass(); 

一个comment in the manual总结得非常好:

stdClass的是默认的PHP对象。 stdClass的没有属性,方法或 母体。它不支持magic 方法,并且不实现接口。

当您将标量或数组转换为 对象时,会得到一个 stdClass的实例。每当你需要一个通用的对象 例如,您可以使用stdClass的 。

+21

如果可以的话,我会多次投票,因为我一直在不停地查看这个答案,以提醒自己“stdClass”。 – 2011-08-11 04:47:13

+43

很容易记住;只要想想艾滋病就是这样,即使你尝试,现在你也永远不会忘记。 – 2013-02-03 19:51:37

+4

$ o =(object)NULL; - 如果一个对象被转换为一个对象,它不会被修改。如果任何其他类型的值被转换为对象,则会创建stdClass内置类的新实例。如果该值为NULL,则新实例将为空。数组转换为一个具有按键指定属性的对象,以及相应的值。对于任何其他值,名为标量的成员变量将包含该值。 – DDS 2013-10-02 21:15:37

15

php.net说,这是最好的:

$new_empty_object = new stdClass(); 
+0

是的,这当然是推荐的方法。 – 2017-01-30 15:22:38

31

我想指出的是,PHP有像感空对象没有这样的事:

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

当然,但$ obj将是空的。

在另一方面空数组在这两种情况下是指从空更改日志功能empty

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

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

报价。

-1

你有这种坏,但有用的工艺:

$var = json_decode(json_encode([]), FALSE); 
+1

坏,坏,非常坏 – 2015-10-17 22:36:45

3

正如其他人所指出的那样,你可以使用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的力量的基础。

+0

brace + 1为无形。 – Pacerier 2015-03-25 05:05:48

+1

@Pacerier你是指无括号? ;)http://www.cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html – 2015-03-29 23:09:05

+1

这是一个错字,它应该是无括号的。 – Pacerier 2015-04-05 17:32:26

7

除了zombat的答案,如果你不断地忘记stdClass

function object(){ 

     return new stdClass(); 

    } 

现在你可以这样做:

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

,以在类似的方式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}; 
43

的标准方式创建一个 “空” 的对象是:

$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"; 
+1

而不是解决问题,你正在创建一个新的。需要修复的问题是人们应该知道'stdClass'的作用。 – Pacerier 2015-03-25 05:04:37

+2

我写了'stdClass'做了什么。我在回答问题的代码上使用了'stdClass'。我很抱歉,但我没有创造一个新问题,那是我个人的观点(正如我写的)。 – cgaldiolo 2015-03-25 18:22:29

+0

我指的是你使用'$ oVal =(object)[];'的偏好。如果你真的做了'$ oVal =(object)[];',那么这是一个问题。 – Pacerier 2015-03-29 02:31:28

3

如果你想创建一个动态属性的物品(如在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 
4

您可以使用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) 
9

我的爱是多么简单的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,但能正常工作在大多数情况下。

3

你也可以尝试这种方式。

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

输出:

$object = new ObjectClass(); 

例如:

class ObjectClass 
{ 
    // Something goes here 
} 

$object = new ObjectClass(); 

现在我们有可变$object

object(stdClass)#1 (0) { } 
2

我们可以简单地使用这种方法创建一个空对象那是ObjectClass,但是是空的。注意如果它包含功能__construct(),那么它可能不是空的。

我知道这是一个古老的问题,但似乎有些人忘记了构造函数。

1

如果你不想这样做:

$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', 
); 
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; ?> 
0

使用通用的对象和密钥值对映射到它。

$oVal = new stdClass(); 
$oVal->key = $value 

或铸一个数组对象

$aVal = array('key'=>'value'); 
$oVal = (object) $aVal;