最近用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,接下来大胆假设,类里边可不可以直接定义数字属性呢?
html' target='_blank'>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) }
求解释这个是什么现象呢?
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答