PHP太烂了,能不能让它好一点?
PHP在软件市场名声不佳。许多开发者对这门语言抱有强烈的抵触情绪,某种程度上来说,他们的看法是正确的。尽管PHP在过去几年中经历了一些发展,但它是否仍然像过去那样是“糟糕设计的分形”呢?
这篇文章最初发布在我的博客“Twodee's Kitchen”上。欢迎大家去看看,多多支持!
是的,我承认,PHP 很烂。
而且我还厚颜无耻地写 PHP 代码,所以我的水平肯定也很差,对吧?
正如那篇著名的文章《PHP:糟糕设计的碎片》中广为流传的说法:
PHP简直是耻辱,是我技艺上的污点。它漏洞百出,却被那些自以为是、只会照搬其他语言的业余爱好者奉为圭臬,简直令人抓狂。它几乎一无是处,我宁愿把它彻底遗忘。
这篇文章多年来越来越受欢迎,至今仍在 Quora 上流传(其中一位读者就是 Quora 的创始人 Adam D'Angelo 本人)。
文章发表后,确实说得对。它的设计和实现都很糟糕,用户更是雪上加霜。PHP虽然问世,但最初的设想并非如此广泛应用。由于它易于上手,人们开始在各种领域使用它,并在一定程度上取得了成功。
随着互联网的普及,我们自身也在改变,我们的需求也在改变。但 PHP 却停滞不前。它仍然落后于时代,这或许要归咎于社区的现状?它的命名不一致,mysql_*设计中还内置了一些不安全的函数。这门语言有很多陷阱,而我长期使用 PHP,深知它有多么令人头疼。
但现在是2019年了,这篇文章写于2012年。我很惊讶人们至今还在到处引用这篇文章!
拜托各位,PHP已经发生了很大的变化(发展),别告诉我大众对此视而不见。
PHP 经历了一些重大变革,例如 Facebook 发起的 HipHop 到 HHVM 的转型以及 PHP 7 的发布。开发者们已经意识到这些变革带来的问题,并且一直在努力解决。如果你生活在 2019 年,还在编写mysql_*函数(或者把这归咎于 PHP),那你真的需要好好读读PHP 文档了。
那为什么这种仇恨依然存在?
嗯,只要某种东西流行,就会有人讨厌它。有人讨厌Java,有人讨厌C++。当数百万人使用你的产品时,你不能指望每个人都对你做的每一个设计决策都满意。总会有人不喜欢你的做法,这适用于任何稍微流行的语言。
人们经常将 Python 与 PHP 在 Web 开发领域进行比较。我并不反对 Python,我认为它是一种很棒的语言,既能胜任其最初的设计用途(脚本编写?),也能胜任其被广泛应用的领域(人工智能/机器学习/数据科学?)。
但Python在这一点上却没能打动我,不如PHP:
-
它速度慢。这并非致命缺陷(尤其是在网页上),但我这么说只是为了提出论点。如果你还在抱怨 PHP 代码丑陋,那我也可以抱怨它速度慢。
-
它需要一个框架来处理所有 Web 相关的事情。最初,当我只想快速搭建一个 Python Web 应用时,社区一直劝我使用 Django 或 Flask。我讨厌被框架束缚,很多人也会(而且应该)和我一样。
-
留白?我不太喜欢。当然,这并非致命缺陷,但我觉得留白有特殊含义并不合理。我理解这是为了让线条更简洁而设计的,但如果因为我忽略了一个看不见的留白而导致画面出错——这让我很恼火。
-
它的面向对象模型对我来说很陌生。访问说明符是通过强制使用下划线来实现的?好吧。不行。也许对某些人来说行得通,但我更喜欢明确地表达,而不是隐含地表达。
好吧,Python 确实是一门很棒的语言。它运行流畅,社区也很活跃,然而——还是有人讨厌它。如果你在某个领域稍微有点名气,那也没关系——总会有人不喜欢你。
另一方面,JavaScript——我真的不喜欢它。这纯属个人喜好。尤其是在一些比我年长几岁的JavaScript高手极力向我推销Node.js,并在我面前大肆抨击PHP之后,我更加反感了。他们断言Node.js远胜于PHP(以及其他任何Web技术),安全、快速,并建议我立刻学习Node.js。
他们甚至说PHP发明了SQL注入。我当时就不想再跟他们说话了。
回到 PHP:
您是否仍在编写/使用遵循晦涩难懂的 PHP 5 方式的旧式 PHP 代码?
我这里有一份清单:
开始编写面向对象编程
虽然你仍然可以编写过程式 PHP 代码,但 PHP 社区已经转向面向对象的方法。面向对象编程完美契合新的模型,并且能够有效地帮助你构建良好的代码结构。采用面向对象编程,SOLID 和 DRY 等一些简洁的代码实践自然而然地就被纳入其中。
面向对象编程(OOP)会默默地强制规范代码库的结构,并更好地分离功能。当然,这并非强制性的,如果你喜欢写意大利面条式代码,也没人拦着你。你可以把 PHP 用得一塌糊涂,让自己名声扫地。但这完全取决于你,任何语言都允许你这么做,不仅仅是 PHP。
尽可能严格地输入
既然说到这个话题,那就也用上严格类型吧。这很简单:<?php declare(strict_types=1)从一开始就使用。静态类型确实能帮助你保持一致性和安全性。没错,PHP 是一种动态类型语言,我们有时确实需要利用它的动态特性。但在大多数情况下,采用更安全的严格类型可以避免运行时出现许多奇怪且不可预测的问题。
请使用命名空间。
页面顶部的 include 语句已不再常见,社区建议您使用命名空间来“导入”需要“使用”的模块。这是一种对原始 PHP 文件进行抽象的方法,允许您封装包含逻辑。
是的,一开始用 ` \<include>` 作为命名空间分隔符可能会有点奇怪,但你会习惯的。去掉那些 `<include>`,开始使用命名空间将文件放在正确的位置。这就引出了我的下一个观点:
作曲家
如果你打算启动一个 PHP 项目,那就立即安装Composerinclude 。它是一个依赖管理工具,可以让你定义依赖项、应用程序和测试入口点,并根据需要从中央 Packagist 仓库加载依赖项。它会自动生成一个自动加载器,而这几乎是你整个项目中唯一需要做的。
丢弃mysql_*
这些mysql_*函数早已被弃用很久了,并且在 PHP 7 中已彻底移除。所以,如果您还在抱怨mysql_*这些函数不好用,请升级您的 PHP 版本。目前处理数据库的最佳方式是使用PDO预处理语句。它是一个通用的 API,可以很好地与各种数据库配合使用。
我喜欢 PDO 的原因在于:它简洁、相对现代的设计、面向对象且具有一致性。一旦你开始使用 PDO 开发项目,很快就会完全转而使用 PDO。
再次强调,不要创建类似这样的数据库包装器DBConnection extends PDO。千万不要。如果你需要对 PDO 进行某种抽象,可以了解一下数据映射器模式和一些 ORM 框架Doctrine(而不是某些糟糕的 Active Record 变体)。
将你的顾虑分开
如今 PHP 饱受诟病,主要是因为新手开发者把它搞得一团糟,甚至比 JavaScript 还糟糕(抱歉,我有点主观)。由于 PHP 易于学习和上手,新手们总是忍不住编写一些蹩脚的代码,然后直接部署到生产环境。
其他语言没有这种效果,因为
a) 他们的学习曲线更陡峭
b) 他们事先制定了严格的设计策略。
c) 让它们投入运行需要时间。
解决这个问题的方法是分离关注点。我记得以前我也经常把长函数的部分代码复制粘贴到其他文件中,实现同样的功能,只是写法略有不同。我理解初学者为什么会这样做。
首先,尽量缩小函数的体积。
将你的代码库拆分成许多独立运行、各自只做一件事的小模块。阅读更多关于 SOLID 和 DRY 原则的内容。
如果你有一个User类,不要允许它创建消息、加密消息并将消息发送给其他用户。
借鉴互联网上的库,别人早就通过更完善的测试解决了你的问题,而且他们做得更好。虽然我们可能很想把所有东西都定制出来,但这往往会偏离实际的业务需求。专注于你的业务逻辑,利用现有的资源。
但并非紧密连接。
PSR 来帮忙了
最后,请遵循编码规范并阅读 PHP-FIG 上的文档。PHP 标准建议 (PSR) 能确保你的代码库保持一致性,便于他人理解和扩展。这些标准能帮助你编写与其他代码兼容的代码,避免你在三个月后因编写糟糕的 PHP 代码而懊恼不已。
这条建议适用于所有编程语言。遵循编码规范,努力编写更优质的代码。当然,没人能阻止你成为一个“代码叛逆者”。我们目前还没有技术手段来阻止你这样做。
(是的,我们确实会这样做,在集成过程中进行代码规范检查可以有效防止低级错误。)
最后几句话
没错,PHP 很烂。其他语言也一样烂。你只能接受这个事实。
你和你的团队有责任编写出如诗如画而非丑陋不堪的代码。即使 Java 代码冗长且采用静态类型,你仍然可能写出非常糟糕的代码。
你害怕用 PHP 开始下一个项目,因为担心同事会评判你?那就放手去做吧。这是你的工作,这是你的工具。
你的同事们可能太自由了,他们的代码可能还在编译中。
文章来源:https://dev.to/2dsharp/php-sucks-can-it-suck-less-1mjb