游客发表
一个做了十年Java的后端,看到PHP代码里出现$arr['key']和$arr[key]居然能跑出不同结果,员鄙第一反应不是程序“哦,原来如此”,员鄙而是程序“这什么鬼东西”。
这就是员鄙鄙视链的起点:不一致。PHP的程序函数命名和参数顺序,几乎像是员鄙每天换一个人来设计的。你想找字符串里有没有某个子串?程序strpos。你想找数组里有没有某个值?员鄙in_array。那你想找字符串里有没有某个字符——等等,程序strstr、员鄙strchr、程序strpos、员鄙str_contains,程序四个函数,四个不同的参数顺序,有的返回位置,有的返回子串,有的返回布尔。我见过一个写了八年PHP的人,在str_replace和preg_replace之间反复查手册,因为一个先搜索后替换,一个先替换后搜索——实际上文档里写的顺序也不一样。
但这只是表面。真正让程序员群体形成“共识”的,是PHP的历史包袱。2000年左右,PHP能火,靠的是“把代码扔进HTML里就能跑”。<?php echo $name; ?>,三分钟建站。那个年代,Java还在写Servlet配web.xml,Python还在用CGI。PHP赢在门槛低。门槛低的代价就是:大量没有计算机基础的人涌入,写出了大量mysql_query("SELECT * FROM users WHERE id = " . $_GET['id'])这种代码。你搜“PHP SQL注入”,能搜出两百万条结果。这不是PHP的错,但PHP成了那个背锅的。
我认识一个做安全审计的朋友,他说看到PHP项目就头疼。不是PHP本身不安全,而是写PHP的人里,有太多人不知道==和===的区别。"1abc" == 1返回true,"1abc" == 1.0也返回true,但"1abc" == "1"返回false。这种“魔法比较”在PHP 8之前简直是灾难。你写if ($userInput == 0),用户输入"admin",居然能进去。这不是段子,这是CVE列表里的真实案例。
语言本身的进化也慢。PHP 5.3才加入闭包,5.4才加入短数组语法[],5.5才有finally,7.0才有标量类型声明和返回类型。而同时期的Python 3.5已经有了async/await,Java 8有了lambda和Stream API。你让一个习惯了List<String> names = users.stream().map(User::getName).collect(Collectors.toList());的人,去看PHP里array_map(function($u) { return $u->name; }, $users),他会觉得像在用打字机写代码。更别提array_map和array_filter的参数顺序——一个先回调后数组,一个先数组后回调。官方文档里还专门有一页叫“Array Functions”的备注,写着“注意:部分函数参数顺序不一致”。
框架生态也加剧了这种印象。Laravel确实优雅,但你看它的底层,还是绕不开PHP那些历史遗留。比如Illuminate\Support\Str里有一堆方法,contains、startsWith、endsWith,看起来很正常。但如果你去翻PHP原生的str_contains,它是PHP 8.0才加入的。在此之前,Laravel自己实现了一套,Symfony又实现了一套,每个框架都在填PHP的坑。一个语言需要框架来提供基础字符串函数,这本身就很说明问题。
还有那个经典的“PHP没有设计模式”的梗。其实PHP支持面向对象,但很多PHP代码里,类只是函数的容器。你看到class User { function getName() { ... } },然后实例化、调用,跟写function get_user_name($id) { ... }没本质区别。没有接口、没有抽象、没有依赖注入。一个写了五年PHP的人,可能从来没写过interface。这在Java或C#程序员眼里,就像是开手动挡的车却从来不用离合器——能开,但总觉得哪里不对。
最要命的是社区氛围。你去Stack Overflow搜PHP问题,高赞回答经常是“用PDO,别用mysql_*”,然后底下评论吵成一团。你去搜Java问题,高赞回答是“用Optional避免NPE”,底下评论是“但Optional有性能开销”。两种氛围,一种在补基础课,一种在讨论设计哲学。时间长了,程序员们自然形成一种印象:PHP是给“做网站”的人用的,不是给“写软件”的人用的。
当然,PHP 8之后好了很多。JIT、联合类型、命名参数、构造器属性提升,这些都在改。但鄙视链一旦形成,就很难扭转。就像你小时候被狗咬过,长大后看到吉娃娃都绕道走——哪怕你知道它咬不动你。程序员对PHP的鄙视,本质上是对“不严谨”的鄙视,对“历史包袱”的鄙视,对“大量低质量代码”的鄙视。PHP恰好把这些都占了。
所以,下次你看到一个程序员在群里发“PHP是世界上最好的语言”,别当真。那是个梗,梗的背后是十几年的血泪史。
```友情链接