最近用curl开发rest方式的api的时候,经常用到json编码,发现了一个奇怪的问题。
大家应该都知道一个数组,经过 json_encode 然后 json_decode 以后会变成一个 对象 ,其中键名变成对象的属性名,
到这里奇怪的事情要发生了,如果这个数组是数字索引的,那么就会出现文中的正题了。
比如下边的这段代码:
/*PHP Version 5.3.10*/
$a[3] = array('id'=>'3','name'=>'hello','description'=>'fasdf');
$m = json_encode($a);
//echo $m;
////$m 的值是 {"3":{"id":"3","name":"hello","description":"fasdf"}}object(stdClass)#1 (1) { ["3"]=> object(stdClass)#2 (3) { ["id"]=> string(1) "3" ["name"]=> string(5) "hello" ["description"]=> string(5) "fasdf" } }
$n = json_decode($m);
var_dump($n);
//输出结果为object(stdClass)#1 (1) { ["3"]=> object(stdClass)#2 (3) { ["id"]=> string(1) "3" ["name"]=> string(5)"hello" ["description"]=> string(5) "fasdf" } }
看到奇怪的现象了吧,["3"]=> object(stdClass)#2 !
其中$n是一个对象,他有一个属性,属性名为3。
OK,接下来大胆假设,类里边可不可以直接定义数字属性呢?
class A {
public $3 = 3;
}
报错:
Parse error: syntax error, unexpected ‘$’, expecting T_VARIABLE in t.php on line 18
再假设,将属性名伪装:
class A {
public function __construct() {
$m = "3";
$this->$m=3;
}
}
发现可以成功运行,继续修改:
class A {
public function __construct() {
$m = "3";
$this->$m=3;
}
}
$a = new A();
var_dump($a);
//输出结果object(A)#3 (1) { ["3"]=> int(3) }
求解释这个是什么现象呢? |