我开始放弃在PHP中使用数组,因为对象非常简洁,在使用对象时,在使用对象时没有性能命中。
目前我的方式是:
$object = (object) array('this' => 'that', 'foo' => (object) array('bar' => 123));
然而,我发现每次因为类型转换不是递归而必须进行类型转换是非常繁琐的......
有没有办法在PHP(或将有)像这样或类似的东西这样做:
$object = {
'this' => 'that',
'foo' => {
'bar' => 123
}
};
答案 0 :(得分:22)
从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;
答案 1 :(得分: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;
}
}
答案 2 :(得分:2)
PHP目前不支持短对象语法。从PHP 5.4开始,它们支持短数组语法。也许5.5将包括你所追求的。
作为替代方案:
您可以将对象制作为JSON并使用json_decode()
:
$json = '{"this": "that", "foo": {"bar": 123}}';
var_dump(json_decode($json));
注意:我只是将其展示为解决问题的方法。我不是在鼓吹这种做法。
答案 3 :(得分: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'))));
答案 4 :(得分: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
}
}
}
}
继续添加你想要添加到批次的任何方法
答案 5 :(得分: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;