带有Int变量的PHP对象

exu*_*sum 6 php object

我注意到PHP对象有些奇怪,但找不到记录的原因.

以下代码演示了该行为

<?php
$a = (object) array( 0 => 1 );
foreach($a as $b => $c) {
  $a->$b = ++$c;  //I'm expecting the key to be overwritten here
}
var_dump($a);
$var = 0;
var_dump($a->$var);
$var = "0";
var_dump($a->$var);
Run Code Online (Sandbox Code Playgroud)

和输出

object(stdClass)#1 (2) {
  [0]=>
  int(1)
  ["0"]=>
  int(2)
}
int(2)
int(2)
Run Code Online (Sandbox Code Playgroud)

使用->语法是否无法访问类的数字部分?

Ja͢*_*͢ck 5

(object)阵列上执行强制转换时,将该数组提升为匿名对象的内部属性列表(即stdClass).

在对象中索引属性的方式与数组的方式略有不同; 具体而言,对象属性名称始终被视为字符串,而基于预期类型查找数组索引(例如,数字字符串被视为整数).

上述行为不会影响foreach循环,因为那里没有涉及散列; 就PHP而言,正在迭代一个常规数组.

要回答您的问题,是的,使用->运算符无法访问原始数组中的数字键.为避免这种情况,您应该在执行强制转换之前从数组中删除数字索引.

在文档中很难找到这种行为,但可以在这里找到它的一些提示:

如果将对象转换为数组,则结果是一个数组,其元素是对象的属性.键是成员变量名,有一些值得注意的例外:整数属性是不可访问的......

FYI

在这种特殊情况下,您可以通过使用引用来规避问题; 不建议这样做,请遵循先前建议不使用数字属性名称:

foreach ($a as &$c) {
    ++$c;
}
unset($c);
Run Code Online (Sandbox Code Playgroud)

更新

2014-11-26:我更新了文档; 实况页面将在本周五更新 - 提交.