Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中初始化像数组这样的对象?_Php - Fatal编程技术网

在PHP中初始化像数组这样的对象?

在PHP中初始化像数组这样的对象?,php,Php,在PHP中,您可以使用以下符号快速使用值初始化数组: $array = array("name" => "member 1", array("name" => "member 1.1") ) .... 对于STDClass对象,有什么方法可以做到这一点吗? 我不知道还有哪条路比这条沉闷的路短 $object = new STDClass(); $object->member1 = "hello, I'm 1"; $object->member1->member1

在PHP中,您可以使用以下符号快速使用值初始化数组:

$array = array("name" => "member 1", array("name" => "member 1.1") ) ....
对于STDClass对象,有什么方法可以做到这一点吗? 我不知道还有哪条路比这条沉闷的路短

$object = new STDClass();
$object->member1 = "hello, I'm 1";
$object->member1->member1 = "hello, I'm 1.1";
$object->member2 = "hello, I'm 2";

您可以使用类型转换:

$object = (object) array("name" => "member 1", array("name" => "member 1.1") );
从显示类型转换和使用递归函数将单个和多维数组转换为标准对象的()帖子:

<?php
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;
    }
}
您可以尝试:

function initStdClass($thing) {
    if (is_array($thing)) {
      return (object) array_map(__FUNCTION__, $thing);
    }
    return $thing;
}

我使用一个类I name Dict:

class Dict {

    public function __construct($values = array()) {
        foreach($values as $k => $v) {
            $this->{$k} = $v;
        }
    }
}

它还具有与其他对象和数组合并的功能,但这有点超出了这个问题的范围。

我也投票支持Gumbo作为首选解决方案,但他提出的建议与问题的内容并不完全一致,这可能会导致一些混淆,即为什么
member1o
看起来更像
member1a

为了确保这一点现在已经很清楚,有两种方法(从5.4开始现在是3种方法)可以在php中生成相同的
stdClass

  • 根据问题的长期或手动方法:

    $object = new stdClass;
    $object->member1 = "hello, I'm 1";
    $object->member1o = new stdClass;
    $object->member1o->member1 = "hello, I'm 1o.1";
    $object->member2 = "hello, I'm 2";
    
  • ala Gumbo建议使用较短或单线版本(为清晰起见,此处展开)从阵列中投射对象

    $object = (object)array(
         'member1' => "hello, I'm 1",
         'member1o' => (object)array(
             'member1' => "hello, I'm 1o.1",
         ),
         'member2' => "hello, I'm 2",
    );
    
  • PHP 5.4+缩短的数组声明样式

    $object = (object)[
         'member1' => "hello, I'm 1",
         'member1o' => (object)['member1' => "hello, I'm 1o.1"],
         'member2' => "hello, I'm 2",
    ];
    
  • 两者将产生完全相同的结果:

    stdClass Object
    (
        [member1] => hello, I'm 1
        [member1o] => stdClass Object
            (
                [member1] => hello, I'm 1o.1
            )
    
        [member2] => hello, I'm 2
    )
    
    哎呀

    您可以使用:

    $object = (object)[]; // shorter version of (object)array();
    
    $object->foo = 'bar';
    
    深度转换的另一个选项是使用
    json\u encode
    +
    json\u decode
    (默认情况下解码为stdClass)。这样,您就不必在每个嵌套对象中重复
    (对象)
    强制转换

    $object = json_decode(json_encode(array(
         'member1' => "hello, I'm 1",
         'member1o' => array(
             'member1' => "hello, I'm 1o.1",
         ),
         'member2' => "hello, I'm 2",
    )));
    
    输出:

    php > print_r($object);
    stdClass Object
    (
        [member1] => hello, I'm 1
        [member1o] => stdClass Object
            (
                [member1] => hello, I'm 1o.1
            )
    
        [member2] => hello, I'm 2
    )
    
    根据对类似问题的回答:

    从PHP7开始,我们有一个允许您在运行时扩展类的功能,包括设置附加属性:


    它不像数组的初始值设定项那样简洁。不知道我会不会用。但是,这是你可以考虑的另一个选项。

    虽然我个人建议实际让你的课程做一些事情,并且使用数组作为“哑容器”,但这是做这件事的方法。Jani,你有一点,但我只是喜欢寻址容器->方式。干杯,我不知道这有那么容易——至少对于一维的。@Gumbo,这在1D以上是行不通的。最简单的解决方案是编写我们自己的函数来扩展它。在第二个
    数组
    之前,可能还有
    (object)
    。请看@nickl-的答案。我要的是多维数组,就是这样。谢谢。目前,我只会使用类型转换。从长远来看,我将在gnud和这个答案之间进行混合:一个可以递归工作的dumb_容器对象。谢谢大家。你能把这个答案扩展到这里吗?链接可能已经死了。链接实际上已经死了!使用
    \uuuu函数\uuuu
    可获得更大的灵活性。完成。                                                         ‬ ⁡⁢⁣⁠⁠⁠⁡您应该将Tim中的“正确勾号”更改为的答案Dumbo@mrzmyr,小飞象还是秋葵?@Pacerier对不起,我是说秋葵:)精彩的总结。值得注意的是,成员1需要与成员1不同。感谢您的全面总结。希望这能被接受!但空数组仍被视为数组。
    $a = new class() extends MyObject {
        public $property1 = 1;
        public $property2 = 2;
    };
    
    echo $a->property1; // prints 1