使用数字键作为对象来投射数组
我正在围绕着PHP的投射机制,并且在将一个数组作为一个对象进行投射时遇到了一个奇怪的情况
$o = (object) array('1'=>'/foo/bar');
$o = new stdClass();
var_dump($o);
据我了解,PHP属性需要用与PHP变量相同的规则来声明。 这是一个有效的变量名,以字母或下划线开头,后面跟着任意数量的字母,数字或下划线。 但是,上面的代码会生成以下输出
object(stdClass)#1 (1) {
[1]=>
string(8) "/foo/bar"
}
当你尝试访问对象中的信息时,它变得非常奇怪。
var_dump($o->1); // parse error
var_dump($o->{'1'}); // NULL
var_dump(get_object_vars($o)); //array(0) { }
无论如何都要查看var_dump报告在对象中的信息,还是仅在请求生命周期的其余部分锁定了这些信息? (实际使用这是零,我只是好奇)
是的,他们只是被锁定,除非重新回到阵列。 PHP中有一些小小的“Gotchas”,例如在旧版本中,您可以将一个常量定义为一个数组,但不会访问其元素。 即使现在你可以定义一个常量作为一个资源(例如, define('MYSQL',mysql_connect());
),尽管这会导致相当不可预知的行为,并且应该避免。
通常,最好尽可能避免数组到对象的转换。 如果您确实需要这样做,请考虑创建一个stdClass
的新实例,然后手动重命名所有变量,例如_0
, _1
等。
$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)
再次编辑:有趣的一面是,以下操作返回false:
$a = array('one','two','three','banana' => 'lime');
$b = array('one','two','banana' => 'lime');
$y = (object)$a;
$z = (object)$b;
var_dump($y == $z);
看来ArrayObject类可以访问属性
$a = new ArrayObject($obj);
echo $a[0];
是的,他们只是被锁定,除非重新回到阵列。
也许,这些属性仍然存在,并且可以访问,而不是直接访问。 但是,我不确定foreach是如何在内部工作的(它可能会将对象转换为数组),因为我没有在源代码中进行调用。
例:
$array = array('one', 'two', 'three', 'four');
$obj = (object) $array;
foreach ($obj as $key => &$val) {
print "$key -> $val<br>";
$val = 'Nhaca';
var_dump($obj);
}
print_r($obj);
print_r($array);
输出:
0 -> one
object(stdClass)[1]
&string 'Nhaca' (length=5)
string 'two' (length=3)
string 'three' (length=5)
string 'four' (length=4)
1 -> two
object(stdClass)[1]
string 'Nhaca' (length=5)
&string 'Nhaca' (length=5)
string 'three' (length=5)
string 'four' (length=4)
2 -> three
object(stdClass)[1]
string 'Nhaca' (length=5)
string 'Nhaca' (length=5)
&string 'Nhaca' (length=5)
string 'four' (length=4)
3 -> four
object(stdClass)[1]
string 'Nhaca' (length=5)
string 'Nhaca' (length=5)
string 'Nhaca' (length=5)
&string 'Nhaca' (length=5)
stdClass Object ( [0] => Nhaca [1] => Nhaca [2] => Nhaca [3] => Nhaca )
Array ( [0] => one [1] => two [2] => three [3] => four )
链接地址: http://www.djcxy.com/p/64859.html