数组和对象之间的PHP类型转换是怎么回事
当我这样做时:数组和对象之间的PHP类型转换是怎么回事,php,arrays,Php,Arrays,当我这样做时: <?php $object = array( 'key' => 'value', 1 => 'value', '11' => 'value', '22' => 'value' ); print_r($object); echo'<br>'; $object = (object)$object; print_r($object); echo'<br>';echo'<br>';
<?php
$object = array(
'key' => 'value',
1 => 'value',
'11' => 'value',
'22' => 'value'
);
print_r($object); echo'<br>';
$object = (object)$object;
print_r($object); echo'<br>';echo'<br>';
//ok looks good so far but then
echo $object->key . '<br>'; // good
echo $object->{1} . '<br>'; // bad
echo $object->{11} . '<br>'; // bad
echo $object->{'22'} . '<br>'; // bad
$object->key = 'changed value';
$object->{1} = 'changed value';
$object->{'11'} = 'changed value';
$object->{'22'} = 'changed value';
echo'<br>'; print_r($object); echo'<br>';echo'<br>';
echo $object->key . '<br>'; // good
echo $object->{1} . '<br>'; // good
echo $object->{11} . '<br>'; // good
echo $object->{'22'} . '<br>'; // good
$object = (array)$object;
echo'<br>'; print_r($object);echo'<br>';echo'<br>';
echo $object['key'] . '<br>'; // good
echo $object[1] . '<br>'; // wtf
echo $object['11'] . '<br>'; // wtf
echo $object['22'] . '<br>'; // wtf
?>
这是PHP中的一个bug吗?为什么会发生这种情况。一个数组或对象如何能有两个相等的键,并且具有不同的值 更新: 给了我一个答案,这里解释如下: 基本上,数组将数字键存储为整数,对象将数字键存储为字符串。 但当您执行数组到对象或对象到数组的强制转换时,该约束不会强制执行
array (size=7)
'key' => string 'changed value' (length=13)
1 => string 'value' (length=5)
11 => string 'value' (length=5)
22 => string 'value' (length=5)
'1' => string 'changed value' (length=13)
'11' => string 'changed value' (length=13)
'22' => string 'changed value' (length=13)
这是不对的;e、 g.11是整数,“11”是字符串(两个不同的键)
使用var\u dump而不是print\u r,因为它显示类型
我建议您尝试使用以下脚本:
<?php
$object = array(
'key' => 'value',
1 => 'value',
'11' => 'value',
'22' => 'value'
);
$object = (object) $object;
var_dump($object);
$object->key = 'changed value';
$object->{1} = 'changed value';
$object->{'11'} = 'changed value';
$object->{'22'} = 'changed value';
$object = (array) $object;
var_dump($object);
更新:
给了我一个答案,这里解释如下:
基本上,数组将数字键存储为整数,对象将数字键存储为字符串。
但当您执行数组到对象或对象到数组的强制转换时,该约束不会强制执行
array (size=7)
'key' => string 'changed value' (length=13)
1 => string 'value' (length=5)
11 => string 'value' (length=5)
22 => string 'value' (length=5)
'1' => string 'changed value' (length=13)
'11' => string 'changed value' (length=13)
'22' => string 'changed value' (length=13)
这是不对的;e、 g.11是整数,“11”是字符串(两个不同的键)
使用var\u dump而不是print\u r,因为它显示类型
我建议您尝试使用以下脚本:
<?php
$object = array(
'key' => 'value',
1 => 'value',
'11' => 'value',
'22' => 'value'
);
$object = (object) $object;
var_dump($object);
$object->key = 'changed value';
$object->{1} = 'changed value';
$object->{'11'} = 'changed value';
$object->{'22'} = 'changed value';
$object = (array) $object;
var_dump($object);
我并没有说这是oop,但很好。这种php行为真是出乎意料。为什么这不会产生致命错误。数组如何仍然包含对象属性。当然,反过来说。具有数组值的对象。这只是一个php wtf。@不管是不是威廉爵士wtf,看这里,这有点道理。“对不起,我不是想冒犯你。”sirwilliam我已经用从PHP核心工程师那里得到的答案更新了答案。我并没有说这是oop,但很好。这种php行为真是出乎意料。为什么这不会产生致命错误。数组如何仍然包含对象属性。当然,反过来说。具有数组值的对象。这只是一个php wtf。@不管是不是威廉爵士wtf,看这里,这有点道理。“对不起,我不是想冒犯你。”sirwilliam我已经用PHP核心工程师提供的答案更新了答案。