PHP中的内联JSON语法

7

如果你可以像这样编写代码,PHP就会更加酷炫:

$array = [2, 3, 5];

$object = { "name" : "Harry", "age" : 23, "cats" : ["fluffy", "mittens", "whiskers"]};

但是,我刚刚花了很长时间寻找一种扩展(甚至是实验性的alpha或任何东西),将json语法添加到PHP中,但什么都没有找到。

这样的东西存在吗?

如果没有,考虑到json_decode()的存在和Facebook的XHP,编写一个扩展来完成这个任务是否困难?

我没有编写PHP扩展的经验,尽管我在大学里做了很多C语言。


1
PHP使用数组来处理这些事情。你觉得这样做更容易吗? - Hrishi
我很久以前就想要这个。看到其中一个荒谬的理由是选择\而不是::作为命名空间运算符的决定之一,是因为解析::的正确性被认为很困难,我怀疑这可能很难实现。另一个给出的理由是\已经作为分隔符对Windows用户来说非常熟悉,好像这很重要似的。 - Jesse Dhillon
2
@Hrishi,即使将JSON转换为关联数组,也没问题。我只是强烈偏爱简洁的JSON语法,而不是array(=>)。 - Bill
将此添加到PHP不是一个选项。但可能有一些文本编辑器可以进行更复杂的代码折叠(显示转换),而不仅仅是语法高亮。 - mario
8个回答

7
你可以使用json_decode来包装你的数据结构,这样就完成了:
$array = json_decode('[2, 3, 5]');

$object = json_decode('{
                           "name" : "Harry",
                           "age" : 23,
                           "cats" : [
                                        "fluffy", "mittens", "whiskers"
                           ]
                       }');

是的,它直到语句被执行才进行类型检查,而且处理多个引号可能会有些问题,但您可以始终使用HEREDOC来解决这个问题。


这将放弃您的编辑器可能进行的任何语法突出显示,并使调试变得更加困难。您还将遇到更多转义引号的问题。看起来比它值得的麻烦更多。对于像 array(2, 3, 5) 这样的简单数组,实际上会更冗长。 - deceze
哦,我并不否认所有的缺点。 - bluesmoon

5

1
“Would take distinctness from []”?“无法通过搜索引擎进行搜索”?“无法阅读”?我无话可说。我真的无言以对 - Ignacio Vazquez-Abrams
2
优点:易读。缺点:难读。也就是“我不愿意承认一开始这个想法很糟糕”的偏见。我喜欢PHP,但语言中有很多方面非常繁琐。 - cbednarski
这就是为什么PHP正失去流行度的原因之一。它的语法真的非常古老。 - Zortext

4
更新:随着PHP 5.4的问世,下面的所有内容都变得有些无关紧要了;我们现在拥有[..]数组语法。
是的,PHP的数组语法过于冗长和丑陋,我也希望它能更加简洁。
但不,尝试为现有版本的PHP更改此功能可能并不是一个好主意,因为这是一个需要嵌入解析器的功能。这意味着您的PHP应用程序只能在自定义编译的PHP版本上运行,这使得您的应用程序可移植性大大降低,从而抵消了PHP的优点之一。
您可以尝试类似编译器的东西,将您的自定义数组语法编译成正常语法,然后再运行代码。但如果您走得那么远,使用完全不同的语言可能是更好的选择。
尝试游说PHP 6.x采用类似JavaScript的语法。在那之前,只需写array()即可。 :)

1

如果你想写一些不是PHP的东西,那就使用不是PHP的东西。否则,使用array()

$array = array(2, 3, 5);

$object = array('name' => 'Harry', 'age' => 23, 'cats' => array('fluffy', 'mittens', 'whiskers'));

1
语言的变化。PHP以前没有类或闭包,现在有了。我认为array(=>)语法过于冗长。我喜欢[]和{:}。 - Bill
最终,PHP采用了[]符号表示数组,这在语法上比array()更好,因此很可能我们很快也会有JSON对象符号表示法。 - Petruza

0

PHP无法处理JSON - 这就是为什么它提供了编码/解码工具。

如果你非常想以那种方式“写”,只需在它周围加上引号:

$object = '{ "name" : "Harry", "age" : 23, "cats" : ["fluffy", "mittens", "whiskers"]}';

就 PHP 而言,'json 对象' 只不过是一个字符串而已...


0
通常混合使用关联数组和数值索引数组就可以解决问题:
$object = array("name" => "Harry", "age" => 23, "cats" => array("fluffy", "mittens", "whiskers"));

在我看来(特别是因为存在json_encode),直接编写JSON与上述内容之间没有实质性的区别。

0
正如大家上面所说,不同的语言有不同的语法 - 如果你不喜欢PHP的语法,你可以考虑其他语言。
JSON代表着“javascript对象表示法” - 也许你想要的是服务器端的javascript。市场上有许多选择服务器端javascript的选项 - jsgi/jack(narwhal)、ringojs、flusspferd、node.js、v8cgi等等。http://wiki.commonjs.org/

1
我认为语义/命名不是没有功能的好理由。如果你想,就叫它PHPON吧。我只是在寻找改进PHP紧凑语法的选项。 - Bill
我并没有说这个名字不应该被加入到PHP中,我只是在指出这个语法的来源是一种已经可以在服务器端使用的语言。 - lucideer
Python的列表和字典具有类似的语法。我个人认为这比array()构造更整洁、更优雅。 - quantumSoup
@Aircule,@Bill - 我有点困惑,为什么你们两个似乎反对我根本没有说过的事情 - 我从来没有说过将JSON语法添加到PHP是一个坏主意,就我个人而言,我确实喜欢这个理念。我只是试图提供有用的替代方案,如果OP想今天在服务器端使用此语法(而不是等待Zend改变想法)。 - lucideer
1
抱歉,当你写下“JSON代表Javascript对象表示法”时,我以为你在挑衅并做出愚蠢的论点。误解了。我很想使用服务器端js,但我已经开始了一个有着大量现有代码库的项目,所以改变语言不是一个选项。谢谢你的建议。 - Bill

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接