@
gouchaoer 语法像 c 是因为它最开始就是作为封装了一批 c 函数专用于做网页的 dsl 出现的,像 java 是因为 php5 就是照着 java 抄的
php 在语法设计上始终让人感觉设计师没上心,一种凑合凑合能用就行的样子。背着一堆历史包袱舍不得丢,为了新特性又引入另一些奇奇怪怪的符号,整个语言给人一种不统一不协调的感觉
比如上面说的反斜线,你见过其他哪个主流语言用过这符号吗?没人用是因为它真的难看,感受一下:
java: com.v2ex.php.Someone.doSth()
c++: v2ex::php::Someone::doSth()
php:\V2ex\Php\Someone::doSth()
再比如变量声明,c 系语言采用类型在变量前面的声明语法:int i; 相应的,函数的返回类型也放在声明的前面:int do_sth(int i);这在语法上是一致的
go/rust/kotlin 等采用类型在变量后面的声明语法:var i int ;函数的返回类型也放在函数声明的最后 func doSth(i int) int; 它们在语法上也是一致的
php 是怎么做的呢?函数形参,类型在参数名称前;函数返回类型,又放在函数最后,还用一个冒号隔开:function doSth(int i): int,这当然不影响使用,但是真是不舒服啊
再去看看
php.net/rfc 里面的提案,更多乱七八糟的符号在排队申请加入 php。由于 @ 被用来当错误抑制符了,[]数组在用,<>估计想留给泛型,注解的支持者们提出的注解语法是什么呢?<< annotation >>,还是从 hack 那抄的
php7 增强了类型,但又不做全,想知道类属性的类型只能靠程序员自觉写 docblock,想做接口文档自动生成、json 反序列化为具体类型麻烦得要死
数组太“强大”,程序员们干什么都喜欢用数组,它什么都能装,完全不同的东西也可以装在一起,不到运行时根本不知道里面都装了些啥,IDE 无法索引推导,无法代码提示,无法一键重构;自动化工具通过反射得不到数组项类型,无法生成靠谱的文档、无法有效的代码检查;使用时各种 isset、各种 assert,防止非预期的数组值,想必这些丑陋的数组项检查代码不陌生吧? if (isset($array[$key]) && ($array[$key] || $array[$key] == 0))) {}
一些很有用的基础语法(比如 enum、泛型)不添加,东抄一个 trait,西抄一个 yield,使用场景还很有限
语言 sdk 全是 c 实现,没有官方的代码库可以作为代码风格范例,长时间代码风格都是乱七八糟的,接触的程序员里就属 php 的代码风格最不羁;更不要说标准库里各种函数命名、参数命名、参数位置不规范不统一的问题了
而关于语言未来的发展,官方一直不给出一个明确的 roadmap,rfc 里的提案又乌烟瘴气乱七八糟,这个语言对未来的规划是怎样?它准备改进哪些方面、考虑加入哪些特性,它对自己的定位是什么?它是否考虑过目前存在的项目变大变复杂就要更换语言技术栈的情况?怎么面对 java、go 在日渐流行的微服务化潮流中带来的挑战?
…
睡觉