V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gouchaoer
V2EX  ›  PHP

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

  •  
  •   gouchaoer · 2017-10-20 17:09:39 +08:00 · 21699 次点击
    这是一个创建于 2351 天前的主题,其中的信息可能已经有所发展或是发生改变。

    神奇的 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
    
    143 条回复    2020-01-31 00:11:21 +08:00
    1  2  
    wdlth
        101
    wdlth  
       2017-10-22 12:41:20 +08:00   ❤️ 1
    @sagaxu 转语言也意味着需要转学别的工具,像包管理,Go 就有 N 种,godep、govendor、glide、gopm 等等,不知道他们是怎么搞出这么多的……
    现在招人、维护填坑的成本比较大,玩新东西风险大,很多厂又改回大众技术栈了……
    sagaxu
        102
    sagaxu  
       2017-10-22 12:56:34 +08:00
    @askfilm 花更少的钱,能做出更多的东西,从这个角度可能成立。能正常写 web 不捣乱的,最便宜的 Java 开发大概是 15K,PHP 的可能 10K 或者 12K 就招到了,复制粘贴一下,单位时间产出可能比 Java 的还高一些。如果 php 在 web 领域毫无争议的高效,就不会有那么多用其他语言写 web 的创业公司了,你可以去专注互联网招聘的 lagou 搜一下职位,C 轮融资以前的公司,到底是 php 多还是 java 多。

    我也觉得自己并不真正了解 php,为什么它有那么多粉丝,而我却找不到一个可以粉的语言。


    @wdlth Lerdorf 还觉得 php 不应该用框架呢,鸟哥还反对 php7.1 的大部分特性呢。

    @wdlth Go 不算很标新立异的东西,入门和熟悉是非常简单的,找填坑的人难度不大。如果用了 erlang 或者 scala,招人就急死 HR 吧。包管理方式多,不求公司内部统一,部门内部统一一下还是可行的,学个包管理器的用法花不了一个小时的。我从 maven 迁移到 gradle,为此还多学了门 groovy 语言,切换起来也没想象的那么难。
    0987363
        103
    0987363  
       2017-10-22 13:09:54 +08:00
    @sagaxu 成都表示 go 真不好招。。满大街都是 php。
    wdlth
        104
    wdlth  
       2017-10-22 13:26:39 +08:00   ❤️ 1
    @sagaxu 对新特性有争议不是很正常么,ECMAScript 那帮家伙都不知道反对多少次了……

    我认为职位数量并无多大意义,不同的行业不同的业务,客户为王,没转化再高大上的东西都没有意义。erlang 职位少,但游戏赚钱,而一大堆互联网公司招聘时说要有大并发的经验,流量还却没有一个个人博客多,还谈什么大并发……
    askfilm
        105
    askfilm  
       2017-10-22 13:47:53 +08:00
    历史总是惊人的相似:
    产品要求 3 个月上线,我们用 php 赶快做出来。。。
    产品终于要重构了,终于不用维护那堆垃圾了, 写 php 写够了,用 java 重写吧, 我们要写好些,避免以后重构。。。
    产品终于又要重构了, 终于不用维护那堆垃圾了, 写 java 写够了,用 go/nodejs 重写吧, 我们要写好些,避免以后重构。。。
    。。。。
    产品终于又要重构了,写够了, 看看有没有更好的东西来重构。。。 我们要写好些,避免以后重构。。。

    重构, 我们总是乐此不疲 —— 程序员
    huntzhan
        106
    huntzhan  
       2017-10-22 13:55:52 +08:00
    精分还行。

    # Array 到底好不好用?

    before> 神奇的 array,这种情况很多

    after> 第一 array 太 jb 好用了

    # 兼容性到底好不好?

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

    after> 其实我很喜欢 php 社区的 3 个风格,第一是实用性,不搞标新立异也不去追求 cool 的东西,一切为了实用,抄 java 规规矩矩的很好;第二是兼容精神,追求性能。。。

    # 语法丑到底能不能接受?

    before> 运维自动化用 php 写比 py 写爽太多了,原因有三点:... 第三 py 语法太恶心了

    after> 你去看 namespace 的 rfc 可以看到官方态度是实用不考虑好不好看 ... 其实我很喜欢 php 社区的 3 个风格,第一是实用性,不搞标新立异也不去追求 cool 的东西,一切为了实用
    sagaxu
        107
    sagaxu  
       2017-10-22 14:14:47 +08:00
    @0987363 据说培训班近期输出上百万 Java 和 PHP 新手,大数据和机器学习好像也要沦陷,遍地是人,能打的却没几个

    @wdlth 职位数多,对中高端求职者就更有利。赚钱的游戏业务很多,用 erlang 的却不多,一个波动之下,主流的可能减半,小众的可能就消失了。高并发是测量开发者能力的指标之一,即使暂时用不到也可以拿来考察人,高并发也不是什么高大上的东西,就算没有经验,能把几个要点讲明白也可以的

    @askfilm 手上一个项目,正准备把管理后台用 PHP 重构,这样以后那块儿就不用我做了,我专心做后端。真实原因跟哪个开发效率高没关系,仅仅是因为我不想再顺便把管理后台做了。名面上当然不能这么说,我只能说“ php 做管理后台开发效率高”,“公司 php 开发人员多,拉人来帮忙方便”。

    重构过 php 项目,重构过 python 项目,重构过 java 项目,也重构过 go 项目,我只想说,重构动态类型语言,太折腾人了
    msg7086
        108
    msg7086  
       2017-10-22 14:42:52 +08:00
    @askfilm 你说 PHP 高效,硅谷的 Rails 程序员恐怕都要笑到胃痛了。
    PHP 的流行,不是因为能花更少的钱做出更多的东西(除非你把 PHP 新手的工资考虑在价格内),而是因为 PHP 只要一个.php 文件随便找个免费空间上传上去就能跑了。
    那个年代就 3 样东西可以这么玩。
    1. cgi-bin 里扔一堆 perl ;
    2. php ;
    3. asp。

    当年最有名的论坛,动网是 ASP 的,雷傲是 Perl 的,vBB 是 PHP 的,三大论坛程序制霸网络。
    当年 ASP 和 PHP 的程序员也是最多的。

    @wdlth 我一直觉得你说的真的完全没错。
    PHP 真的就只适合小项目。结构堆得越大,语言级别带来的作用就越明显。
    别的不说,光一个 cgi 结构(而不是常驻内存)就要让多少人欲仙欲死。
    然后 PHP 还是那种不用框架就更欲仙欲死的语言(来试试满屏的 isset($_POST[*])
    而这两份欲仙欲死,又能带来更多的欲仙欲死。
    得到的,本该是像梦境一般幸福的时间……
    但是,为什么,会变成这样呢……
    gouchaoer
        109
    gouchaoer  
    OP
       2017-10-22 15:17:35 +08:00
    @sagaxu php 码农构成上素质不太好是真的,因为学校里科班出来的或者是自己折腾出来的很少会去玩 php,所以大厂很难招到基础好的人,so 还是转 java 吧。。。
    sagaxu
        110
    sagaxu  
       2017-10-22 16:00:56 +08:00
    @gouchaoer 这就很尴尬了,为什么最好的语言,吸引来的却是基础最差的开发者。而比较高级的 phper,很多还是 C 或者 Java 的好手。
    wdlth
        111
    wdlth  
       2017-10-22 16:18:11 +08:00
    @msg7086 这不是 PHP 语言的问题,是运行时的问题,因为原先运行时设计就是执行后销毁,让资源可以释放,在资源有限的情况下给不同的程序服务。
    对于单一应用而言,现在出现了像 HHVM 和 Swoole 等常驻内存的环境,同样可以支撑大型应用的运行。
    msg7086
        112
    msg7086  
       2017-10-22 16:27:56 +08:00
    @sagaxu 不学习多种语言,怎么能算得上比较高级的程序员。
    wdlth
        113
    wdlth  
       2017-10-22 16:30:12 +08:00
    @sagaxu 穷则搁置争议,达则自古以来
    sagaxu
        114
    sagaxu  
       2017-10-22 16:46:45 +08:00
    @wdlth hhvm 已经分裂成 hack 语言的平台了,差异太大,已经不关 php 的事了。swoole 是以牺牲大量框架为代价的,主流框架,官方都不支持 swoole,需要自己适配。而且能玩的转 swoole 的高级 php 开发,玩 Java 和 Go 也很容易,在大项目上死守 php 是为了信仰吗?
    aksoft
        115
    aksoft  
       2017-10-22 16:47:13 +08:00
    静静的看你们装逼,看你们用固定电话按出 xp
    msg7086
        116
    msg7086  
       2017-10-22 16:51:38 +08:00
    @wdlth 常驻内存环境都已经不能算是传统意义上的 PHP 程序了。
    常驻内存还用 PHP 我只能想到一个意义:重用现有的轮子。
    然而正常情况下连框架都换了,没道理不直接重写。
    Fedor
        117
    Fedor  
       2017-10-22 16:52:08 +08:00
    口我
























    bramblex
        118
    bramblex  
       2017-10-22 17:10:35 +08:00
    @sagaxu

    为啥不用 rust ……性能炸裂而且还比 go 好用。

    毕竟 google 是个 demo 大厂,做出来的东西很高级然而并不好用。
    des
        119
    des  
       2017-10-22 17:17:35 +08:00 via Android
    @msg7086 先打一顿。
    其实现在的东西基本都是先上个框架然后再干活,其实也差多少
    wdlth
        120
    wdlth  
       2017-10-22 17:50:42 +08:00
    @sagaxu Java 还算语法相近,Go 就算了,语法和招人都不好办。并且转的话就回到了资本问题,而不是个技术问题。现在大多数的业务,特别是以关系型数据库为主的系统,谁能保证转了效率一定能提高?提高多少?会不会带来更多的问题?提高了是否可以获取更多的回报?如果有钱,做横向扩展,找 DBA 优化数据库,增加更多的服务器、存储和带宽,会不会更好?以前百度还死守 GCC 3.4.5 呢,这不是什么信仰真爱的问题,都是被逼的。

    之前鸟哥提到 PHP 7 新增了个 Hugepage,我就尝试开了一下,结果影响了其他服务……
    visonme
        121
    visonme  
       2017-10-22 18:13:49 +08:00
    这种话题最后评论都会"跑调"的,php 学的牛的基本都是 C/C++程序猿~
    sagaxu
        122
    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
        123
    wdlth  
       2017-10-22 21:34:03 +08:00
    @sagaxu 单机环境,用 Spring,连关系型数据库,能跑几万的并发?这个数据库和磁盘的性能真不错。
    zjsxwc
        124
    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
        125
    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
        126
    araraloren  
       2017-10-23 08:20:24 +08:00
    @msg7086 看到凤姐,我想到了一点,外国佬喜欢凤姐。。。
    askfilm
        127
    askfilm  
       2017-10-23 09:53:14 +08:00
    @sagaxu “而 Java 用 spring 这么复杂的框架也能跑到几万” 真能忽悠, 离谱了, 牛都吹没影了。。。
    你用 cache, 讲个毛线,php 最慢的框架上个 cache, rps 也能上万 (注意我说的是上万, 不敢说几万)
    gesse
        128
    gesse  
       2017-10-23 10:03:59 +08:00
    请用 var_dump
    sagaxu
        129
    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
        130
    askfilm  
       2017-10-23 10:47:36 +08:00
    你家机器真好。。。
    askfilm
        131
    askfilm  
       2017-10-23 10:54:03 +08:00
    单机都几十万,上百万的 rps 呀, 我还真是长见识了。。。。。咋不上天呢?
    everhythm
        132
    everhythm  
       2017-10-23 11:23:49 +08:00
    围观,php 不严谨的类型转换,在不要求严谨的情况下开发效率极高

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

    稍微有点异常要想走完整段代码,怕是满屏 try-except 才行
    haierspi
        133
    haierspi  
       2017-10-23 16:44:21 +08:00
    这几句明显的 编写的语句错误... 为啥要 PHP 来背锅?
    haierspi
        134
    haierspi  
       2017-10-23 16:45:54 +08:00
    @everhythm PHP7 现在已经支持 严格模式..
    243627152
        135
    243627152  
       2017-10-28 18:38:53 +08:00
    @sagaxu 1.PHP7 已经支持数据类型了,2.什么叫性能好就上 swoole?我被你雷倒了!! 3.你的 spring 跑这么快 还要集群架构做什么!
    crazyneo
        136
    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
        137
    gouchaoer  
    OP
       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
        138
    hweining  
       2017-11-08 16:34:28 +08:00
    知乎看到的:1. 变量名的一个“$”,不知道要让一个 PHP 程序员一年多敲几次键; 2. 变量名大小写敏感,而函数名、方法名、类名又不区分大小写。第二个的确有点困扰。。。
    meszyouh
        139
    meszyouh  
       2017-11-10 10:40:35 +08:00
    我反正是受不了 PHP 的函数名
    OMGZui
        140
    OMGZui  
       2017-11-10 16:27:41 +08:00
    终于看到像样些的吐槽,那位睡觉的大哥,嘻嘻,php 优势是 web,做好这个本分就很好,需要大数据和高性能请增加自己的技术栈,单 php 可是不够的哦。
    kevn
        141
    kevn  
       2017-11-16 10:26:27 +08:00
    1 这样的代码语法本来就是错误的,其他语言也照样会报错的,只是 php 无需编译,所以只有在运行的时候才出错
    2 php 的灵活就是体现在这点上,脚本语言、无需编译、即改即用,但缺点就是其错误捕捉这块比较混乱,不好捕捉
    3 但是也有一些令人抓狂的错误比如: "hello" == 0 这样的语句在 php 中返回的竟然是 true (虽然理论上说得通)
    4 个人觉得 php 只适用于中小型 web 的快速开发,项目做大了是无可避免要用其他语言( java、c#等)重构的
    5 最后,没有最强的编程语言,只有最强的程序员,作为 phpper 一定要注意错误捕捉这块
    slince
        142
    slince  
       2017-11-18 23:22:27 +08:00
    纯属为了黑而黑
    ritaswc
        143
    ritaswc  
       2020-01-31 00:11:21 +08:00
    学艺不精怪语言 +1
    为什么一个变量使用两种不同类型用途?
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3377 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:20 · PVG 19:20 · LAX 04:20 · JFK 07:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.