我也来吐槽 PHP 最垃圾的地方

2017-10-20 17:09:39 +08:00
 gouchaoer

神奇的 array,这种情况很多

php > $a=[];
php > echo $a[1];
PHP Notice:  Undefined offset: 1 in php shell code on line 1
php > $a=null;
php > echo $a[1];
php > $a=4;
php > echo $a[1];

另外最受不了的就是以下的情况,很多时候一个对象可能为空,这个直接抛 Fatal error 退出脚本简直要命,不过这个在 php7 之后似乎改成抛异常了

php > $o=null;
php > $o->fun();
PHP Fatal error:  Call to a member function fun() on a non-object in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
23216 次点击
所在节点    PHP
143 条回复
cyzhu
2017-10-21 12:19:43 +08:00
有这功夫学会新语言,或者加入 php 核心开发组。有句话叫:要么忍,要么.
voocel
2017-10-21 12:24:12 +08:00
看了这些评论,我就放心了
rashawn
2017-10-21 12:37:08 +08:00
@WuwuGin 可能 7 楼用的数据库是拿 PHP 写的…
ahkxhyl
2017-10-21 13:26:17 +08:00
自己的锅 自己背
aksoft
2017-10-21 13:51:50 +08:00
用着人家的东西,说人家垃圾?
rozbo
2017-10-21 14:55:07 +08:00
@iyaozhen 你这就想当然了,php server.php 你试过吗?单线程的 php 的如何解决多个用户并发的问题?
除非你用 swoole 来解决,但 swoole 不就是为了填 php 的坑吗。
agui2200
2017-10-21 15:27:37 +08:00
(手动斜眼 :) 然而 go 早已看穿一切,swoole 真的好用么?看他的文档就知道了
lianz
2017-10-21 16:23:56 +08:00
@agui2200 除了那种 70 年代的风格之外,go 真是好东西
s2722357
2017-10-21 16:46:30 +08:00
这么了垃圾的语言,你还用,找一个不垃圾的多好,或者自己开发一门语言, python 好像就这么出来的吧,加油,我看好你
agui2200
2017-10-21 17:35:49 +08:00
@lianz 风格我觉得还可以,最起码“魔力”没那么强
laoma
2017-10-21 19:50:08 +08:00
恕我直言,只有半路出家的码农才用 php 和 python 和 js 等辣鸡需要。。
laoma
2017-10-21 19:50:28 +08:00
语言
printempw
2017-10-21 22:47:00 +08:00
真希望能看到一点对 PHP 的有水平的批评啊😑

但总是事与愿违 :P
cncqw
2017-10-21 23:29:18 +08:00
@feiyuanqiu 命名空间格式是可以自定义的,且没有强制要求必须使用,凭自己想当然有意思?
humpy
2017-10-21 23:48:39 +08:00
@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 在日渐流行的微服务化潮流中带来的挑战?



睡觉
9999999999999999
2017-10-22 00:58:52 +08:00
建议睡觉
gouchaoer
2017-10-22 02:41:46 +08:00
@humpy 你吐槽这么厉害,我可以解释一部分问题,namespace 用\是因为.被用来拼接字符串,为啥不用+呢?因为脚本语言+默认会转成 int,而.则是 string,你去看 namespace 的 rfc 可以看到官方态度是实用不考虑好不好看。至于语法抄 c/java 我很喜欢,我特别讨厌那种标新立异然而没有暖用的语法比如 go/Python。

php7 加入 typehint 的标量类型不给类属性类型很简单,因为他是脚本语言,给函数参数限定类型已经是极限了;至于返回值放后面,那是因为 function 关键字在前面,放后面前面无所谓吧。。。其实我很喜欢 php 社区的 3 个风格,第一是实用性,不搞标新立异也不去追求 cool 的东西,一切为了实用,抄 java 规规矩矩的很好;第二是兼容精神,追求性能。。。社区无法给出 roadmap 很简单,因为核心开发就那几个,很多 feature 都是社区 rfc 大家提投票来的,php7 的主要有 dmitry、nikita 和鸟哥搞出来,现在他们在搞 jit,短时间内 php 的语法 feature 不会有太大变动。
gouchaoer
2017-10-22 02:45:59 +08:00
如果泛型都加了那就是 hack 了,不是脚本语言了,说到底就我的理解,我希望 php 保持这个状态,规规矩矩的做好自己的事情就 ok 了,不要有太大野心
jfcherng
2017-10-22 02:57:25 +08:00
到底為什麼當初字串拼接選擇使用 . 符號呢
msg7086
2017-10-22 05:43:37 +08:00
@gouchaoer 虽然你说的我们都懂,但是有时候还是会说一句……

「这代码真™难看啊!」

就像你拍 Cosplay,拍一个美少女 JK 和拍个 Feng 姐,你选哪个?

何况说 PHP 实用的我也要打个问号,实用性和别的语言比能高到哪里去。

#↑ @jfcherng 如果一定一定要找个原因的话,那就是 PHP 最开始并没有面向对象的概念。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/399310

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX