2012-11-16 49 views
7

我开始摆脱使用PHP中的数组,因为对象非常整洁,并且在php 5中使用对象时没有性能命中。PHP写入对象嵌入

目前我做的方式是:

$object = (object) array('this' => 'that', 'foo' => (object) array('bar' => 123));

不过,我觉得它很繁琐不得不强制转换每次为铸字心不是递归...

有什么办法在PHP的(或将有)做到这一点或类似的东西:

$object = { 
    'this' => 'that', 
    'foo' => { 
     'bar' => 123 
    } 
}; 
+5

为什么你想,当你创建一个数组反正使用对象? – Peon

+0

我不明白你需要这样做。 – NappingRabbit

+1

你可以升级到php 5.4并使用短阵列语法;这会让你的代码更加整洁。我和@DainisAbols虽然;无论如何,我不确定你想要通过类型转换来实现什么。在这种情况下,您看到在数组上使用对象有什么优势? – SDC

回答

4

我建议你建立一个函数宽度StdClass

function arrayToObject($array) { 
    if(!is_array($array)) { 
     return $array; 
    } 

    $object = new stdClass(); 
    if (is_array($array) && count($array) > 0) { 
     foreach ($array as $name=>$value) { 
     $name = strtolower(trim($name)); 
     if (!empty($name)) { 
      $object->$name = arrayToObject($value); 
     } 
     } 
     return $object; 
    } 
    else { 
     return FALSE; 
    } 
} 
0

遗憾的是没有语法创建stdClass情况那样。但你可以使用new关键字和任何spl类(我承认没有太多整数)。如果你想优化的按键,你可以写一个小助手功能如下:

function O($a){ 
    return new ArrayObject($a); // has -> and [] support too 
} 

,写

$stuff = O(array('a' => 'tickle me elmo', 'b' => O(array('foo' => 'bar')))); 
0

虽然我真的不能明白你为什么会想这样做( 关联数组在本质上仅数据对象),但如果你坚持:
相反铸造的每一个阵列,在每一个层面一个对象,你可以使用下面的“把戏/黑客”

$object = json_decode(
       json_encode(
        array('some'=>array('multi'=>'Dimensional'), 
         'array'=>'that', 
         'you' => array('want' => 'to', 
             'turn' => 'into'), 
         'an' => 'object'))); 

这将所有阵列转换为stdClass的实例,我相信这是您想要的。
再说一遍,我不得不说:PHP是而不是 JavaScript和对象在像PHP这样的语言中相对昂贵(相对而言),那么它们在JS中。如果你不需要一个对象,我强烈建议你坚持使用assoc数组。

状物体,数组可以是类型暗示function foo (array $argument){}
如果你真的想使他们成为一些类的特定情况下,为什么不改变构造,对付一个数组:

class My_Object extends stdClass 
{ 
    public function __construct(array $params = null) 
    { 
     if (!empty($params)) 
     { 
      foreach ($params as $name => $value) 
      { 
       $this->{$name} = $value;//set everything 
      } 
     } 
    } 
} 

,并继续添加要添加到不少

2

PHP目前不支持短对象语法什么方法。从PHP 5.4开始,它们支持短阵列语法。也许5.5会包含你以后的内容。

作为替代方案:

你可以精心的对象作为JSON和使用json_decode()

$json = '{"this": "that", "foo": {"bar": 123}}'; 
var_dump(json_decode($json)); 

注:我只是显示这个作为的方式来解决你的问题的示范。我不主张这种做法。

+1

正确的代码将是$ json ='{“this”:“that”,“foo”:{“bar”:123}}'; –

+0

谢谢。在那里混合一点数组语法:) –

+0

不错的答案,我会将它改为像<<< JSON JSON; 只是为了避免引用地狱 –

16

从PHP 5.4开始,短阵列语法已经可用。这允许你像这样初始化数组:

$myArray = ["propertyA" => 1, "propertyB" => 2]; 

从PHP7开始,PHP中没有当前的短对象语法。但是,你可以投短阵语法像这样创建对象:

$myObject = (object) ["propertyA" => 1, "propertyB" => 2]; 

看起来比使用下面的结构更漂亮和更短:

$myObject = new \StdClass(); 
$myObject->propertyA = 1; 
$myObject->propertyB = 2; 
0

我有,当你收到一个已经建立了一种替代解决方案阵列。 假设你的数组有n个嵌套数组,所以你没有机会以简单的方式投射每一个数组。 这会做的伎俩:

$object = json_decode(json_encode($unknownArray)); 

我不会在一个大的循环或类似的东西用这个,因为它不仅仅是与阵列sintax坚持与它生活的方式慢。 此外,如果数组的元素是一个函数或其他有趣的事情,这将打破这一点。

用法示例:

$unknownArray = array(
    'a' => '1', 
    'b' => '2', 
    'c' => '3', 
    'd' => array(
     'x' => '7', 
     'y' => '8', 
     'z' => '9', 
    ), 
); 
$object = json_decode(json_encode($unknownArray)); 
echo $object->d->x;