Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组和对象之间的PHP类型转换是怎么回事_Php_Arrays - Fatal编程技术网

数组和对象之间的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核心工程师提供的答案更新了答案。