关于 PHP 中带减号的变量的处理方法

最近在研究 Challonge 的 API
在输出 tournaments 表的时候,看到了一个很奇怪的东西

1
2
$tournamentsList = $api_instance[$key]->getTournaments()->tournament;
print_r($tournamentsList);

输出结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SimpleXMLElement Object
(
[id] => 2213854
[name] => DFXRC first match
[url] => DFXRC_first_match
[description] => <strong>DFXRC</strong> is strong!
[tournament-type] => single elimination
[started-at] => 2016-02-04T00:05:26-08:00
[completed-at] => SimpleXMLElement Object
(
[@attributes] => Array
(
[type] => dateTime
[nil] => true
)

)
.....

看到那个 started-at 了没?没错!你没看错,变量名里面居然有减号!!!

按照 PHP 变量名的命名规范来说,这种变量名简直就是犯规啊!这要怎么访问??
按照常理来说,应该用

1
echo $tournamentsList->started-at

这样直接访问的,可是很明显,减号会被识别成运算符
这样语义就变成了变量 start 减变量 at 了
不出所料,打开页面返回 HTTP 500= =
想了想,加引号试试

1
echo $tournamentsList->"started-at"

结果还是不行,直接语法错误
真是逼死人,直接再定义一个变量!

1
2
$word="started-at";
echo $tournamentsList->$word;

这样居然成功了!!天哪,访问个变量居然要定义两个变量,怎么这么麻烦!
正准备去给他们报个 issue,结果看到前面已经有人提出来了
他们官方给出的访问方法居然是这样的...

1
echo (string)$tournament->{'tournament-type'};

真是长见识了,加花括号再加引号的访问变量 = =,厉害厉害,佩服啊!