我注意到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)
使用->语法是否无法访问类的数字部分?
在(object)阵列上执行强制转换时,将该数组提升为匿名对象的内部属性列表(即stdClass).
在对象中索引属性的方式与数组的方式略有不同; 具体而言,对象属性名称始终被视为字符串,而基于预期类型查找数组索引(例如,数字字符串被视为整数).
上述行为不会影响foreach循环,因为那里没有涉及散列; 就PHP而言,正在迭代一个常规数组.
要回答您的问题,是的,使用->运算符无法访问原始数组中的数字键.为避免这种情况,您应该在执行强制转换之前从数组中删除数字索引.
在文档中很难找到这种行为,但可以在这里找到它的一些提示:
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性.键是成员变量名,有一些值得注意的例外:整数属性是不可访问的......
在这种特殊情况下,您可以通过使用引用来规避问题; 不建议这样做,请遵循先前建议不使用数字属性名称:
foreach ($a as &$c) {
++$c;
}
unset($c);
Run Code Online (Sandbox Code Playgroud)
2014-11-26:我更新了文档; 实况页面将在本周五更新 - 提交.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |