神奇的 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
1
pangliang 2017-10-20 17:17:58 +08:00
$o->fun(); o 是 null 这句不报错继续执行不是更要命?
|
2
liuguang 2017-10-20 17:20:10 +08:00 1
自己代码问题,还怪 PHP 报错
|
4
kunluanbudang 2017-10-20 17:24:31 +08:00 1
基本共识了, 语法层面,
有些东西, PHP 就是与主流语言显得与众不同 |
5
kunluanbudang 2017-10-20 17:25:20 +08:00 1
JS 写起来舒服多了
|
6
HYSS 2017-10-20 17:25:49 +08:00
我觉得你写法肯定有问题 如果一个属性是对象的话 肯定不可能是为空的
|
7
silencefent 2017-10-20 17:29:46 +08:00
语法这个层面其实也没什么,主要还是性能不高
今天为了新增一个积分数据,涉及关联 6 张表,十几个字段,然后运行更新,限制了 300 条数据都跑出超时(超时时间 300s ),最后 100 条 100 条的改,搞了很久 |
8
Mrun 2017-10-20 17:31:49 +08:00
@silencefent 这个跟性能有什么关系,大概率是 DB 设计的有问题
|
9
2ME 2017-10-20 17:34:40 +08:00
array 那个没毛病阿 只是在 array 的情况下给你个提示 只是看着不爽 三次 echo 的结果应该都是一样的
你可以选择关闭掉 Notice 提示 满足强迫症 现在的工作是做爬虫和脚本 深有体会 Fatal error 真是要命.. |
10
cdwyd 2017-10-20 17:36:39 +08:00 via Android
@silencefent
这个锅 php 肯定不背 |
11
RLib 2017-10-20 17:38:55 +08:00
不是 array 隐含转成 array, 是 array 就检查 index, 合乎情理...
|
12
gouchaoer OP @2ME 都说了这个在 php7 下不会 Fatal error 改抛异常了,我建议你把你爬虫随便找一个 web 框架的 console 中跑,一般 web 框架 hook 了 warning 啥的变成异常,catch 起来很简单那
|
13
gouchaoer OP @kunluanbudang 50 步笑 100 步,脚本语言里面每一个好东西
|
14
zhs227 2017-10-20 17:55:35 +08:00
@silencefent 相对于数据库操作的时间,php 脚本的逻辑执行时间少得可怜。你说的这种情况用其它语言速度可能也快不到哪里去。
对于费时的操作可以使用 phpcli 运行,防止超时造成数据丢失或者重复,慢点就慢点。容器配置了脚本都有超时时间是相对于其它语言的一大特色 |
15
crabRunning 2017-10-20 17:57:17 +08:00 1
```
let a = null; typeof null === 'object'; a.test // fuck ``` |
16
fcten 2017-10-20 18:20:06 +08:00
某一楼已经充分表明了 PHP 的巨大优势——门槛低
|
17
yxn1910 2017-10-20 18:27:02 +08:00
虽然黑 PHP 是政治正确,但是似乎大家都没有黑到点上。。。失望。。。
|
18
misaka19000 2017-10-20 18:31:03 +08:00 via Android
楼主竟然敢黑 PHP,真是胆大包天
|
19
pqee 2017-10-20 18:39:41 +08:00 2
七楼建议退出 PHP 届。
十七楼说得对! |
20
WuwuGin 2017-10-20 18:39:48 +08:00 via Android
等于说 7 楼这货是怎么能说 PHP 性能差的,赶快在表结构逻辑不变的情况下展示一下其他语言的性能。
|
22
sagaxu 2017-10-20 20:07:58 +08:00 via Android
槽点再多不还是得捏着鼻子用?毕竟其它语言入门要麻烦好多
|
25
kn007 2017-10-20 20:21:32 +08:00
就异常抛出解决这块,貌似 python 比 php 好。。刚入门 python 的感觉,感觉后续也有很多坑。。
php,第二点感觉没多大毛病。。第一点有点。。。 |
26
ZXCDFGTYU 2017-10-20 20:21:48 +08:00
各取所长就好了,成天你垃圾我牛逼的,有意思?
|
27
ZXCDFGTYU 2017-10-20 20:27:04 +08:00
有些需求 php 做不来或者有更好的其他语言实现那就哪个好使就用哪个,有些东西用 php 做合适那就 php 呗,不明白成天为了所谓的 php 是垃圾还是牛逼这种毛用没用的小学生问题成天吵有什么意思?
利益相关:2 年 PHP,为了工作更高效目前在学运维和 python。 |
29
cxbig 2017-10-20 20:49:49 +08:00
代码偷工减料,却抱怨语言对错误或异常处理不够干净。。。
|
31
torbrowserbridge 2017-10-20 21:26:18 +08:00 via Android
学艺不精怪语言哈哈哈,脸皮真厚。
|
32
bucky 2017-10-20 21:34:47 +08:00
php 这语言里要使用那么多奇怪的符号,看着就恶心
|
34
abcbuzhiming 2017-10-20 21:37:40 +08:00
@kunluanbudang 啥? js ?我们要不要讨论一下各种 js 空和未定义的区别?大哥笑二哥
|
35
wdlth 2017-10-20 21:38:41 +08:00
抛异常也不是一个好的解决方法,为空的话下面的业务能正常继续么?
|
38
byfar 2017-10-20 22:31:29 +08:00
异常: 当然是选择原谅他
|
40
cncqw 2017-10-20 22:57:40 +08:00
@silencefent 你这个黑的太低端了,明明是数据库的锅都能怪到 php 头上,你换个别的语言操作还不是一样,关联 6 张表不卡出翔才怪。一般黑 php 的估计都是自己水平不咋地,遇到问题就抱怨语言不好,真正的大牛早就闷声发大财了。
|
41
feiyuanqiu 2017-10-20 23:03:39 +08:00
@cncqw 命名空间的反斜线简直要了人的命,难以想象究竟是多扭曲的人决定采用这个丑陋的符号
|
42
gouchaoer OP @ZXCDFGTYU 我很讨厌你这种任何技术都有其优点的论调啊,垃圾就是垃圾,还骂不得了啊?
|
43
gouchaoer OP @ZXCDFGTYU 运维自动化用 php 写比 py 写爽太多了,原因有三点:第一 array 太 jb 好用了,第二标准函数太 jb 好用了,第三 py 语法太恶心了
@feiyuanqiu 名称空间分隔用\不是拍脑袋想出来的,跟 windows 用\做路径分隔一样。。。本质原因是当初.被用了拼接字符串没用+号 至于吐槽$号的,还有 php 语法奇怪的,我可以告诉你们其实 php 语法非常非常规矩,很像 java/c,不作 |
44
dobelee 2017-10-20 23:32:05 +08:00 via Android
看到那么多不入流的码农我就放心啦。
|
45
lgpqdwjh 2017-10-20 23:44:17 +08:00
看到有人装 b 我就放心了
|
47
jfcherng 2017-10-20 23:59:52 +08:00
|
48
msg7086 2017-10-21 03:48:11 +08:00 1
你知道为什么 PHP 那么多东西都莫名其妙用的 Warning Error Fatal 而不是异常吗?
因为 PHP 初期根本就没异常这东西…… 类和对象在 PHP 4.x 就有了,而异常呢? PHP 5 才有。 所以这也不能算是最辣鸡的地方,因为异常是语言特性,而 PHP 才刚刚支持没多久。 在语言逐渐发展过程中,会慢慢修正原先的设计路线,加入新特性的。 |
49
askfilm 2017-10-21 07:16:54 +08:00 1
学艺不精怪语言 +1
|
50
simaguo 2017-10-21 08:40:10 +08:00
看到还有人黑 php,我就放心了
|
51
rozbo 2017-10-21 09:08:06 +08:00
你们应该黑不支持多线程,不支持常驻
|
53
meanmachine 2017-10-21 10:01:36 +08:00 via Android
@skyjerry swoole 现在也不能线程了
|
54
iyaozhen 2017-10-21 10:07:03 +08:00 via Android
@rozbo 你还是没黑到点上,多线程这个对。常驻内存这个是 CGI 的运行方式决定的。你也可以 php server.php 自己监听端口,但是一般不这样做。
|
55
fengh0409 2017-10-21 10:18:12 +08:00
觉得垃圾你就不用啊,在这里拉仇恨显得你很牛逼?
|
56
yuanchao 2017-10-21 10:35:12 +08:00
每次看到有黑 PHP 的帖子我都点进来看~~
|
57
yuanchao 2017-10-21 10:35:33 +08:00
可惜都没黑到点上。。。
|
58
lianz 2017-10-21 10:55:46 +08:00
@silencefent 智商感人。超时问题,如果是 PHP 本身运行速度问题,那得起码有上千万行的代码才可能跑出超时啊。如果是数据库访问速度问题,那换别的任何语言一样慢。
|
59
killerv 2017-10-21 11:39:44 +08:00
@silencefent 你这个 100%是数据库的问题( sql 或者数据库本身)
|
60
linxl 2017-10-21 11:54:59 +08:00
似乎吐槽 php 能获得优越感.
|
61
cyzhu 2017-10-21 12:19:43 +08:00
有这功夫学会新语言,或者加入 php 核心开发组。有句话叫:要么忍,要么.
|
62
voocel 2017-10-21 12:24:12 +08:00 via Android
看了这些评论,我就放心了
|
64
ahkxhyl 2017-10-21 13:26:17 +08:00
自己的锅 自己背
|
65
aksoft 2017-10-21 13:51:50 +08:00
用着人家的东西,说人家垃圾?
|
66
rozbo 2017-10-21 14:55:07 +08:00
@iyaozhen 你这就想当然了,php server.php 你试过吗?单线程的 php 的如何解决多个用户并发的问题?
除非你用 swoole 来解决,但 swoole 不就是为了填 php 的坑吗。 |
67
agui2200 2017-10-21 15:27:37 +08:00
(手动斜眼 :) 然而 go 早已看穿一切,swoole 真的好用么?看他的文档就知道了
|
69
s2722357 2017-10-21 16:46:30 +08:00 1
这么了垃圾的语言,你还用,找一个不垃圾的多好,或者自己开发一门语言, python 好像就这么出来的吧,加油,我看好你
|
71
laoma 2017-10-21 19:50:08 +08:00 via Android
恕我直言,只有半路出家的码农才用 php 和 python 和 js 等辣鸡需要。。
|
72
laoma 2017-10-21 19:50:28 +08:00 via Android
语言
|
73
printempw 2017-10-21 22:47:00 +08:00 via Android
真希望能看到一点对 PHP 的有水平的批评啊😑
但总是事与愿违 :P |
74
cncqw 2017-10-21 23:29:18 +08:00
@feiyuanqiu 命名空间格式是可以自定义的,且没有强制要求必须使用,凭自己想当然有意思?
|
75
humpy 2017-10-21 23:48:39 +08:00 4
@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 在日渐流行的微服务化潮流中带来的挑战? … 睡觉 |
76
9999999999999999 2017-10-22 00:58:52 +08:00
建议睡觉
|
77
gouchaoer OP @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 不会有太大变动。 |
78
gouchaoer OP 如果泛型都加了那就是 hack 了,不是脚本语言了,说到底就我的理解,我希望 php 保持这个状态,规规矩矩的做好自己的事情就 ok 了,不要有太大野心
|
79
jfcherng 2017-10-22 02:57:25 +08:00
到底為什麼當初字串拼接選擇使用 . 符號呢
|
80
msg7086 2017-10-22 05:43:37 +08:00
|
81
KevinM 2017-10-22 08:18:10 +08:00
@gouchaoer 有一句講一句,+ . 這個純粹就是當初 . 用掉了現在沒法改而已,關腳本語言甚麼事情?+ . 默認做不做 implicit conversion 不過語言設計上的事情。
|
82
gouchaoer OP @KevinM 那你说说+被用来加 int 了,string 拼接用啥符号?难道也用+然后看第一个操作数是 int 还是 string 么?这不可能,因为很多时候你不知道那到底是 int 还是 string,就跟"0"是 empty 一样,咋一看很脏,但实际用起来就觉得顺手
|
83
gouchaoer OP @msg7086 可以自己拌?
实用性是 php 的很大特点,很多 feature 都是需求催生出来的,php 也会加进去。。。比如独特的 php-fpm 机制,比如啥 safe_mod、global_magic_quote、extract、user_dir 这些失败 feature,你可以看到为了解决问题 php 在不停的尝试,而不是告诉用户你该怎么怎么做 |
84
qqfs 2017-10-22 10:31:14 +08:00
mmp 想试试 php -a,发现 windows 版 php 根本不支持
|
85
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 是最好的语言,你们怎么看~ |
88
msg7086 2017-10-22 11:10:24 +08:00
@gouchaoer 不停地尝试并不能解决问题。
这种尝试的代价是很大的。(比如 Python 是最好的两个语言?) 比如说写个程序,你可以尝试,因为大不了 git checkout HEAD~1。 但是语言的尝试是永久生效的,而且一旦要 revert 必然要被人围殴(程:MMP 怎么又不向后兼容了?) 这里 +和. 的占用直接导致了难看的反斜杠语法。 其实还不止这一处。想想 :: 和 -> 之分? $deletedRows = App\Flight::where('active', 0)->delete(); 哇塞我的氪金狗眼…… |
89
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 的会很多,三年后来看吧。 |
90
sagaxu 2017-10-22 11:27:39 +08:00
@msg7086 在语言设计上不断试错,那也是无奈之举,PHP 背后缺乏大公司的推动,好不容易有个 facebook,却跟社区分道扬镳了
|
91
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 -- 滑铁卢大学系统设计工程应用科学学士学位。 |
92
msg7086 2017-10-22 11:31:14 +08:00
@sagaxu PHP 语言中,隐式自动转换算是他家最大的特点之一,string 和 int 是可以无缝互转的,所以不存在只用一个运算符实现两种能隐式转换类型相加和相连接的方法。
|
93
askfilm 2017-10-22 11:31:48 +08:00
@sagaxu
1. 大公司用 php 的多的是,国内国外都有很多, 你那句话有问题! 另外 php 的全球 web 方向的份额依然是最高的。 2. 大部分的语言都是互相借鉴的, 也就所谓的东拼西凑。 3. 最近一两年 PHP 市场萎缩很明显, 最近一两年中小型公司倒的比较多, 中小企业对 php 的需求比较大; 然而这 2 年其他语言的市场也不见得能好不到哪去, 大环境使然。 4. lnmp 依然是开发 web 的最佳方案, 但是从业员的平均技能基础较差,这是事实。 所以我们用开发框架来提高门槛, 我们这边要求开发者要会 symfony , 想招差的都挺难。 |
95
msg7086 2017-10-22 11:52:44 +08:00
|
96
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 啊? |
97
wdlth 2017-10-22 12:09:29 +08:00
@msg7086 招到人也算是刚需吧,Golang 也好,Erlang 也好,招到玩得好的人难,需要从别的开发语言转过去。所以市场上还是一堆 C/C++、Java、PHP。
|
99
askfilm 2017-10-22 12:18:41 +08:00
@sagaxu php 的优势比较大,不是他内置模板能力强, 是他高效, 简单的讲就是花更少的钱,能做出更多的东西.
你也只能从技术的眼光来看东西 .... 还有根据你说法可知你并不真正了解 php, 说的都是一些 php 初学者的话 |