是的,它们只是被锁定,除非返回到数组。 PHP 中有一些小“陷阱”,例如在旧版本中,您可以将常量定义为数组,但永远不会访问其元素。即使现在您也可以将常量定义为资源(例如,define('MYSQL',mysql_connect());
)尽管这会导致相当不可预测的行为,并且应该再次避免。
一般来说,如果可能的话,最好避免数组到对象的转换。如果您确实需要这样做,请考虑创建一个新实例stdClass
然后手动重命名所有变量,例如_0
, _1
, etc.
$a = array('cat','dog','pheasant');
$o = new stdClass;
foreach ($a as $k => $v) {
if (is_numeric($k)) {
$k = "_{$k}";
}
$o->$k = $v;
}
编辑:刚刚对这个假设做了一次快速测试,是的,它们在对象上下文中正式“不存在”;数据被存储,但无法访问,因此是最终的私有成员。这是测试:
$a = array('one','two','three');
$o = (object)$a;
var_dump(property_exists($o, 1), property_exists($o, '1'));
输出是:
bool(false)
bool(false)
再次编辑:有趣的旁注,以下操作返回错误:
$a = array('one','two','three','banana' => 'lime');
$b = array('one','two','banana' => 'lime');
$y = (object)$a;
$z = (object)$b;
var_dump($y == $z);