群里说起 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["\0T\0esta"]); var_dump($a["\0*\0b"]);
探针应该是没事吧!
好哇!~那个访问私有属性太BT
这是在探究php的内部构造啊~确实书上说字符串数组技术是属于‘哈希’……
解释器的强大之处啊。
我很好奇php的成员变量和字符串数组的处理到底有多大不同……毕竟在静态字符串情况下用起来是一样的……