我开始不再在 PHP 中使用数组,因为对象更加简洁,并且在 php 5 中使用对象时不会影响性能。
目前我的做法是:
$object = (object) array('this' => 'that', 'foo' => (object) array('bar' => 123));
但是,我发现每次都必须进行类型转换非常乏味,因为类型转换不是递归的......
php 中是否有任何方法(或将会有)这样做或类似的事情:
$object = {
'this' => 'that',
'foo' => {
'bar' => 123
}
};
从 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;
我建议你构建一个函数宽度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;
}
}
PHP 目前不支持短对象语法。从 PHP 5.4 开始,它们支持短数组语法。也许 5.5 会包含您所追求的内容。
替代方案:
您可以将对象制作为 JSON 并使用
json_decode()
:
$json = '{"this": "that", "foo": {"bar": 123}}';
var_dump(json_decode($json));
注意:我只是将其展示为解决您问题的方法的演示。我并不提倡这种做法。
当您收到已构建的阵列时,我有一个替代解决方案。 假设您的数组有 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;
不幸的是,没有语法可以创建这样的
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'))));
虽然我真的不明白你为什么要这样做(关联数组本质上是纯数据对象),但如果你坚持:
而不是在每个级别上将每个数组强制转换为一个对象,您可以使用以下“技巧/黑客”:
$object = json_decode(
json_encode(
array('some'=>array('multi'=>'Dimensional'),
'array'=>'that',
'you' => array('want' => 'to',
'turn' => 'into'),
'an' => 'object')));
这会将所有数组转换为
stdClass
的实例,我相信这就是您想要的。 像对象一样,数组可以是 类型提示:
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
}
}
}
}
然后继续添加您想要添加到批次中的任何方法