PHP写对象内联

cnjp1d6j  于 2023-06-28  发布在  PHP
关注(0)|答案(6)|浏览(111)

我开始远离在PHP中使用数组,因为对象是如此整洁,在php5中使用对象时没有性能问题。
目前我的做法是:
$object = (object) array('this' => 'that', 'foo' => (object) array('bar' => 123));
然而,我发现每次都要进行类型转换是非常乏味的,因为类型转换不是递归的……
在php中有没有(或者会有)这样的方法或者类似的东西:

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

lyr7nygr1#

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

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

在PHP7之前,PHP中没有短对象语法。但是你可以转换短数组语法来创建这样的对象:

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

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

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

t1qtbnec2#

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

uyto3xhc3#

PHP目前不支持短对象语法。从PHP 5.4开始,它们支持短数组语法。也许5.5会包括你所追求的。
作为替代方案:
您可以将对象创建为JSON并使用json_decode()

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

**注意:**我只是展示了一种解决问题的方法。我并不提倡这种做法。

i34xakig

i34xakig4#

我有一个替代的解决方案,当你收到一个已经建成的阵列。假设你的数组有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;
s3fp2yjn

s3fp2yjn5#

不幸的是,没有像这样创建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'))));
6mw9ycah

6mw9ycah6#

虽然我真的不明白你为什么要这样做(* 关联数组本质上是纯数据对象 *),但如果你坚持:
你可以使用下面的 “trick/hack”,而不是将每个级别上的每个数组都转换为一个对象:

$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数组。
和对象一样,数组也可以 * type-hint *: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
            }
        }
    }
}

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

相关问题