14

我开始放弃在 PHP 中使用数组,因为对象更加整洁,并且在 php 5 中使用对象时没有性能影响。

目前我这样做的方式是:

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

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

php(或将有)有什么方法可以这样做或类似的东西:

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

6 回答 6

39

从 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;
于 2016-03-22T15:29:25.413 回答
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;
    }
}
于 2012-11-16T13:10:08.477 回答
3

PHP 当前不支持短对象语法。从 PHP 5.4 开始,它们支持短数组语法。也许 5.5 将包括你所追求的。

作为备选:

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

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

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

于 2012-11-16T13:43:38.803 回答
1

当您收到已构建的数组时,我有一个替代解决方案。假设您的数组有 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;
于 2016-06-10T17:03:50.300 回答
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
            }
        }
    }
}

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

于 2012-11-16T13:29:02.350 回答
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'))));
于 2012-11-16T13:11:39.070 回答