PHP 内联写入对象

问题描述 投票:0回答:6

我开始不再在 PHP 中使用数组,因为对象更加简洁,并且在 php 5 中使用对象时不会影响性能。

目前我的做法是:

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

但是,我发现每次都必须进行类型转换非常乏味,因为类型转换不是递归的......

php 中是否有任何方法(或将会有)这样做或类似的事情:

$object = {
    'this' => 'that',
    'foo' => {
        'bar' => 123
    }
};
php javascript arrays object syntax
6个回答
46
投票

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

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

从 PHP 8.2 开始,PHP 中目前没有短对象语法。但是您可以转换短数组语法来创建像这样的对象:

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

比使用以下结构看起来更好更短:

$object = new \StdClass();
$object->this = 'that';
$object->foo = \StdClass();
$object->foo->bar = 123;

5
投票

我建议你构建一个函数宽度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;
    }
}

3
投票

PHP 目前不支持短对象语法。从 PHP 5.4 开始,它们支持短数组语法。也许 5.5 会包含您所追求的内容。

替代方案:

您可以将对象制作为 JSON 并使用

json_decode()
:

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

注意:我只是将其展示为解决您问题的方法的演示。我并不提倡这种做法。


2
投票

当您收到已构建的阵列时,我有一个替代解决方案。 假设您的数组有 n 个嵌套数组,因此您无法以简单的方式转换每个数组。 这就能解决问题:

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

我不会在大循环或类似的东西中使用它,因为它比仅仅坚持使用数组语法并接受它要慢得多。 另外,如果数组的元素是一个函数或其他一些有趣的东西,这会打破这一点。

使用示例:

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

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 中。如果您不需要对象,我强烈建议您坚持使用关联数组。

像对象一样,数组可以是 类型提示

function foo (array $argument){}

如果你真的想将它们变成某个类的特定实例,为什么不更改 constructor 来处理数组:

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

然后继续添加您想要添加到批次中的任何方法

© www.soinside.com 2019 - 2024. All rights reserved.