我也来吐槽 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
23217 次点击
所在节点    PHP
143 条回复
KevinM
2017-10-22 08:18:10 +08:00
@gouchaoer 有一句講一句,+ . 這個純粹就是當初 . 用掉了現在沒法改而已,關腳本語言甚麼事情?+ . 默認做不做 implicit conversion 不過語言設計上的事情。
gouchaoer
2017-10-22 09:50:57 +08:00
@KevinM 那你说说+被用来加 int 了,string 拼接用啥符号?难道也用+然后看第一个操作数是 int 还是 string 么?这不可能,因为很多时候你不知道那到底是 int 还是 string,就跟"0"是 empty 一样,咋一看很脏,但实际用起来就觉得顺手
gouchaoer
2017-10-22 09:56:31 +08:00
@msg7086 可以自己拌?
实用性是 php 的很大特点,很多 feature 都是需求催生出来的,php 也会加进去。。。比如独特的 php-fpm 机制,比如啥 safe_mod、global_magic_quote、extract、user_dir 这些失败 feature,你可以看到为了解决问题 php 在不停的尝试,而不是告诉用户你该怎么怎么做
qqfs
2017-10-22 10:31:14 +08:00
mmp 想试试 php -a,发现 windows 版 php 根本不支持
lulin
2017-10-22 10:47:49 +08:00
-。- 哈哈

javascript -> typescript

严格 null 和 any

// 声明下类型
let arr: string[] = []
// 正常
arr[0] = '0'
// 提示 number -> string warn
arr[1] = 0
// 提示 string is not assignable to number
const result: number = arr[2] + 1
// 提示 string 没有 test
arr[3].test

=.= 我如果说 JS 是最好的语言,你们怎么看~
weilongs
2017-10-22 10:54:28 +08:00
@laoma 怪不得市面上用的多.都是半路出家的公司要的半路出家的人.
lulin
2017-10-22 11:01:57 +08:00
@laoma 不好意思,我用 JS 得罪大佬了~请问大佬用什么?
msg7086
2017-10-22 11:10:24 +08:00
@gouchaoer 不停地尝试并不能解决问题。
这种尝试的代价是很大的。(比如 Python 是最好的两个语言?)

比如说写个程序,你可以尝试,因为大不了 git checkout HEAD~1。
但是语言的尝试是永久生效的,而且一旦要 revert 必然要被人围殴(程:MMP 怎么又不向后兼容了?)
这里 +和. 的占用直接导致了难看的反斜杠语法。
其实还不止这一处。想想 :: 和 -> 之分?

$deletedRows = App\Flight::where('active', 0)->delete();

哇塞我的氪金狗眼……
sagaxu
2017-10-22 11:14:41 +08:00
@gouchaoer “因为脚本语言+默认会转成 int ” ?可能 Python 和 JavaScript 都不算脚本语言吧。
PHP 如果保持现在这个状态,很可能会越来越小众,最近一两年 PHP 市场萎缩很明显,转 Java 转 Go 的非常多。
String 拼接和 int 相加都用+,遇到 string + int,可以把 int 转为 string,或者干脆禁止 string 和 int 相加

@humpy PHP 语法本身就是东拼西凑的,缺乏整体设计和一致性,大公司现在在这个领域宁可选 node 也不用 php


预言先放这里,未来三到五年,PHP 转 Java 转 Go 转 Node 的会很多,三年后来看吧。
sagaxu
2017-10-22 11:27:39 +08:00
@msg7086 在语言设计上不断试错,那也是无奈之举,PHP 背后缺乏大公司的推动,好不容易有个 facebook,却跟社区分道扬镳了
msg7086
2017-10-22 11:28:30 +08:00
safemod 禁用了一堆函数导致各种 app 炸穿还要逼得用户把选项关掉。
自动 quote 惯坏了一堆新手还顺便给老手带来了二次 quote 的问题,还让查询拼接大法阴魂不散。
extract 污染本地变量。
user_dir 什么鬼东西就不提了。

PHP 所做的尝试在我看来,就是一个不懂得怎么设计语言的人,左一棒子,右一棒子,然后偷偷看一眼用户心态崩了没?

一个简单的猜测:
Perl 设计者 Larry Wall -- UCB 研究生院毕业。
Python 设计者 Guido van Rossum -- 阿姆斯特丹大学数学和计算机科学硕士学位。
Ruby 设计者 松本行弘 -- 島根大学大学院博士課程単位取得退学。
PHP 设计者 Rasmus Lerdorf -- 滑铁卢大学系统设计工程应用科学学士学位。
msg7086
2017-10-22 11:31:14 +08:00
@sagaxu PHP 语言中,隐式自动转换算是他家最大的特点之一,string 和 int 是可以无缝互转的,所以不存在只用一个运算符实现两种能隐式转换类型相加和相连接的方法。
askfilm
2017-10-22 11:31:48 +08:00
@sagaxu
1. 大公司用 php 的多的是,国内国外都有很多, 你那句话有问题! 另外 php 的全球 web 方向的份额依然是最高的。
2. 大部分的语言都是互相借鉴的, 也就所谓的东拼西凑。
3. 最近一两年 PHP 市场萎缩很明显, 最近一两年中小型公司倒的比较多, 中小企业对 php 的需求比较大; 然而这 2 年其他语言的市场也不见得能好不到哪去, 大环境使然。
4. lnmp 依然是开发 web 的最佳方案, 但是从业员的平均技能基础较差,这是事实。 所以我们用开发框架来提高门槛, 我们这边要求开发者要会 symfony , 想招差的都挺难。
wdlth
2017-10-22 11:37:27 +08:00
@msg7086 C 和 C++ 的那堆:: . -> <> * & …也很难看,但这就是语言,靠简单的符号实现复杂的东西。
msg7086
2017-10-22 11:52:44 +08:00
@wdlth 是挺难看的,所以你看有多少人是自愿去用 C/C++的。
还不是被性能或者运行环境逼着去用的。
但是 PHP 就不一样了,没硬性条件逼着你去用,所以不是刚需。
sagaxu
2017-10-22 12:05:50 +08:00
@msg7086 这种 string to int 的隐式转换正是 PHP 最大的缺陷,坏到根上了,太多的 bug 是因为这个引起的了。
@msg7086 PHP 在学历构成上太吃亏了,用户普遍学历低,核心团队也不像别人家语言那样遍地名校硕士以上。

@askfilm 都很多? 国外 facebook 已经是 hack 语言了,没 php 的事。FLAG 里其它几家都不用 php。国内阿里巴巴也彻底不用 php 了,php 业务全部迁移到 node 了,阿里的标签是 Java。腾讯和百度的标签是 C++,其次是 Java。几个后起之秀,携程京东等等,也都是 Java 和 C++。

全球 web 方向的份额? 光 wordpress 就是垄断大部分 web 网站了。但是 wp 的流行能贡献多少职位?

你自己也这么说“中小企业对 php 的需求比较大”,为何中小企业长大之后就要对 PHP 需求比较小了?

lnmp 依然是开发 web 的最佳方案?在 2017 年看来,php 在这方面其实优势不大了。只要够熟悉,用 python+django/flask 或者 Java + springboot,只输出 json,页面完全交给前端,开发效率上并没有太大的差别。过去 php 的优势比较大,只是他内置模板能力太强,现在不输出页面只输出 json 了,这个优势就不存在了。

如果业务稍微大一点,Java 可以平滑的升级到 springcloud,而 php 这边并没有能相提并论的开源设施。公司规模稍大一些,就需要大数据和机器学习的应用了,前者是 Java 的天下,后者是 Python 做原型 C++做产品。

php 越来越符合自己的定位了,安安静静的做个吐页面的那一层,最多加一点简单的 CRUD,服务还是交给静态类型语言去做吧。

为什么 php 从业人员基础普遍不好?因为 php 主要是做 web 的。其实 Java 做 web 的基础也差,基础不差的,有几个人心甘情愿一直做 web 啊?
wdlth
2017-10-22 12:09:29 +08:00
@msg7086 招到人也算是刚需吧,Golang 也好,Erlang 也好,招到玩得好的人难,需要从别的开发语言转过去。所以市场上还是一堆 C/C++、Java、PHP。
sagaxu
2017-10-22 12:13:53 +08:00
@wdlth 招 Java 或者 C++的,转 Golang 很容易,我司招 Kotlin 的时候招的是 Java 的
askfilm
2017-10-22 12:18:41 +08:00
@sagaxu php 的优势比较大,不是他内置模板能力强, 是他高效, 简单的讲就是花更少的钱,能做出更多的东西.
你也只能从技术的眼光来看东西 .... 还有根据你说法可知你并不真正了解 php, 说的都是一些 php 初学者的话
wdlth
2017-10-22 12:19:45 +08:00
@sagaxu 看来 Rasmus Lerdorf 也得学马云了,他人生中最大的错误是创造了 PHP,他明明是想做个小页面而已,但现在 PHP 彻底改变了他的生活……

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

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

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

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

© 2021 V2EX