一个 php 对象数组转型的神奇结果

作者: nick 分类: php 发布时间: 2010-06-14 09:54 ė 61条评论

群里说起 php 的数组 key 的类型转换问题,

比如 $a = array(‘123’=>’abc’); var_dump($a); 会发现 key 会变成整数。用 $a[‘123’] 这种方式访问数组的时候,也会先把 key 转换成整数。突然想到能不能构造一个实际 key 为字符串形式的数字的数组,或者整数型属性名的对象(对象内部也是个 hash,也同时支持整数和字符串 key)。试了一些方法没成功。然后看到了这篇东西

http://www.laruence.com/2010/05/26/1541.html

就想到了个构造那样的数组和对象的方法。

$o = new stdClass();
$o->{‘123’} = 1;
$a = (array) $o;
var_dump($a);
var_dump(isset($a[‘123’]));
var_dump(isset($a[123]));

$a = array(1,2,3);
$o = (object) $a;
var_dump($o);
var_dump(isset($o->{1}));
var_dump(isset($o->{‘1’}));

这样就构造出了正常方式没法访问的数组下标和对象属性*(访问对象属性时会把属性名转成字符串)。

还可以干一件更 BT 的事情,访问对象的私有或保护属性。

class Test {
private $a = 1;
protected $b = 2;
public $c = 3;
}
$o = new Test();
$a = (array) $o;
var_dump($a);
var_dump($a[“\0Test\0a”]);
var_dump($a[“\0*\0b”]);

本文出自 传播、沟通、分享,转载时请注明出处及相应链接。

本文永久链接: https://www.nickdd.cn/?p=766

发表评论

您的电子邮箱地址不会被公开。

Ɣ回顶部