我也来吐槽 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
23219 次点击
所在节点    PHP
143 条回复
visonme
2017-10-22 18:13:49 +08:00
这种话题最后评论都会"跑调"的,php 学的牛的基本都是 C/C++程序猿~
sagaxu
2017-10-22 20:37:13 +08:00
@bramblex Rust 的门槛比 Go 高的多,它替代的目标是 C++,能搞明白 ownership 和 lifetime 的,大概率也是 C++老狗一只。从 PHP 到 Rust 的切换,要比 Go 艰难许多,加上 Go 的库比 Rust 全一些,还有 goroutine 这种天生高并发神器,选择 Go 是很自然的事情。

@wdlth 语法上的鸿沟,拦住的只是菜鸟级的开发,中高级开发可以无视语法上的巨大差异,只要编程范式一样,就能快速入门,花半天对比一下数据类型和定义,循环分支控制结构,再看几个常用的数据结构的用法,就算语言上入门了。Go 和 PHP 的差异是语法上的,不是范式上的,切换过去是比较容易的。PHP 开发往往基础比较差,对 memory model 一般没什么概念,所以刚接触进程内并发的时候,有些东西要补一补,这点上换 Java 还是换 Go 都是一样的。

PHP 转 Go 或者 Java,不仅仅是性能提升,还是动态类型语言往静态类型语言的转换,越大的项目,动态类型越坑爹,PHP 还摊上了弱类型,代码重构的时候简直是灾难。性能本身的提升也很重要,用 FPM 随便搭个 php 写的框架,不连 db 性能也立刻很难看,如果不幸用了 laravel,rps 可能会掉到只有几百,而 Java 用 spring 这么复杂的框架也能跑到几万。这不是一两倍的差距,是一个 order 的差距,10 台扩展到 100 台要多少钱? 100 台扩展到 1000 台要多少钱?如果 PHP 想要性能好,只能换 swoole,而 swoole 稳定性不是很有保障,并且自费武功,失去大部分框架。即便用了 swoole,由于没有多线程模型,还有很多进程内的通信不方便做。百度以前还死守过 gcc 2.9.x 呢,不还是要往上升。
wdlth
2017-10-22 21:34:03 +08:00
@sagaxu 单机环境,用 Spring,连关系型数据库,能跑几万的并发?这个数据库和磁盘的性能真不错。
zjsxwc
2017-10-22 22:18:54 +08:00
同意楼主的说法,PHP 的数组操作会出现各种不可预知的诡异情况(比如这种情况 https://3v4l.org/ACrH6 ),我们 PHP 项目除了模板渲染外的业务代码里都避免直接使用数组操作,而是用对象和实例来写。

比如对于楼主提到的问题, 我们是用 Collection 类封装(继承了 ArrayObject 类, 参考这个项目 https://github.com/schmittjoh/php-collection/blob/master/doc/index.rst )来表示同一类型的数组。

恩,其实项目完全 OO 化后(我们用 Symfony ),PHP 写代码比我之前用 Java 爽,既可以享受到脚本语言写业务的灵活性,又不缺类型化自动推导的严谨。
sagaxu
2017-10-22 22:32:45 +08:00
@wdlth 每个请求都不停的 cache miss 吗?

第 1 级是进程内的 cache,纳秒级
第 2 级是 redis/memcache,纳秒级 + 0.x 毫秒的网络延迟
第 3 级是 mysql/pgsql 等 db 的 cache
第 4 级是文件系统的 VFS cache

要连续击穿 4 层 cache 才会考验到磁盘性能
araraloren
2017-10-23 08:20:24 +08:00
@msg7086 看到凤姐,我想到了一点,外国佬喜欢凤姐。。。
askfilm
2017-10-23 09:53:14 +08:00
@sagaxu “而 Java 用 spring 这么复杂的框架也能跑到几万” 真能忽悠, 离谱了, 牛都吹没影了。。。
你用 cache, 讲个毛线,php 最慢的框架上个 cache, rps 也能上万 (注意我说的是上万, 不敢说几万)
gesse
2017-10-23 10:03:59 +08:00
请用 var_dump
sagaxu
2017-10-23 10:26:04 +08:00
@askfilm
单条 sql 查询,不用 cache,用 spring 也有 1 万 6,用 vertx 是 13 万
https://www.techempower.com/benchmarks/#section=data-r14&hw=ph&test=db

hello world,spring 也能跑 10 几万 rps,vertx 都过百万了,也就 phper 觉得 hello world 跑几万 rps 就是高性能

看来,部分 phper,不仅基础差,还要加上没见识
askfilm
2017-10-23 10:47:36 +08:00
你家机器真好。。。
askfilm
2017-10-23 10:54:03 +08:00
单机都几十万,上百万的 rps 呀, 我还真是长见识了。。。。。咋不上天呢?
everhythm
2017-10-23 11:23:49 +08:00
围观,php 不严谨的类型转换,在不要求严谨的情况下开发效率极高

至于异常问题,写 py 之后才觉得 php 的好,什么类型不对 、dict 没声明下一层 dict 直接抛异常

稍微有点异常要想走完整段代码,怕是满屏 try-except 才行
haierspi
2017-10-23 16:44:21 +08:00
这几句明显的 编写的语句错误... 为啥要 PHP 来背锅?
haierspi
2017-10-23 16:45:54 +08:00
@everhythm PHP7 现在已经支持 严格模式..
243627152
2017-10-28 18:38:53 +08:00
@sagaxu 1.PHP7 已经支持数据类型了,2.什么叫性能好就上 swoole?我被你雷倒了!! 3.你的 spring 跑这么快 还要集群架构做什么!
crazyneo
2017-10-31 19:43:44 +08:00
我吐槽一条,composer 对于依赖包版本的处理是令人发指的,maven 和 go get+git submodule 比这个真的好一万倍,尤其是 json+lock 来做依赖包描述,我的妈,作为一个临时赶工人员一下午趟的坑比之前用 c++&Java&Golang 趟过的坑都要多,甚至于完全不能根据手册来做而要开发人员随时准备介入环境搭建的过程。
语法之类我就不吐槽了,什么都是数组,比我当年用 perl 写 cgi 脚本还要千篇一律的往里塞,然后再加个弱动态类型,炸了就。
赶完这个工,我他妈再碰 php 我就是狗,要我接手这项目我他妈立马就辞职,这么多年这么多 php 码农们都是怎么活下来的?只写业务逻辑?
gouchaoer
2017-11-01 14:27:03 +08:00
@crazyneo composer 的机制和 maven 区别不是很大啊,实际上各语言的包管理都差不多吧。。。以前社区设计了类似 maven 的 pear 包管理没人用,后来 composer 才开始流行,composer 的本质除了版本管理外,就是加载名称空间了。。。。怎么说呢,用了 composer 的话你们内部开发可以完全把依赖都放进版本控制里面。。。
另外我说过 php 和 java 很像,数组、对象、链表、队列啥的标准库都有的,只是没人用而已。。。嘛,choose a stack and stick with it...
hweining
2017-11-08 16:34:28 +08:00
知乎看到的:1. 变量名的一个“$”,不知道要让一个 PHP 程序员一年多敲几次键; 2. 变量名大小写敏感,而函数名、方法名、类名又不区分大小写。第二个的确有点困扰。。。
meszyouh
2017-11-10 10:40:35 +08:00
我反正是受不了 PHP 的函数名
OMGZui
2017-11-10 16:27:41 +08:00
终于看到像样些的吐槽,那位睡觉的大哥,嘻嘻,php 优势是 web,做好这个本分就很好,需要大数据和高性能请增加自己的技术栈,单 php 可是不够的哦。

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

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

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

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

© 2021 V2EX