PHP在软件开发市场上,较之前几年,似乎有点下降。还有一些开发人员对PHP持有不满意态度。某种程度上,这是正确的看法。在过去的几年中,PHP经历了一次大规模的重构,它是不是将错误的设计彻底分开了呢?
我承认,PHP的确糟糕。我尚佯做不知的写了好多年PHP,我必须接受现今所有对PHP不友好的言论。可是这样做对吗?
多数开发者对PHP语言的普遍态度是:不良的语言设计。这种言论对一个资深PHP开发者感到很尴尬,甚至对一颗工匠之心造成了困扰,曾经这个世界上最好的Web开发语言,现在是如此的破,比Perl还“破”(并没有对Perl语言有任何不敬之意)。
但是我想起最开始学编程时,包括自己与身边并不是计算机专业的人称赞,有大夫还有摄影师,学液压的工程师,他们压根没学过神马编译原理,数据库,操作系统等专业课,但却因为PHP而疯狂的喜欢上了网站开发。
就在几年前,在Quora上有一篇文章被广泛传播。这篇文章的作者是Quora的创始人Adam D’Angelo。此文章的大意是PHP设计不当,部署不好,开发者使用情况很是糟糕。
不妨回顾一下PHP刚出现的时候,它开始并没有像现在这样被大规模应用。由于它的易用性,很多人在各个领域都在用它来开发网站或单个应用。后来互联网发展越来越大,行业发生了转变,人们的需求也变了。PHP好像没咋变,还显得有点迟滞,这可能是PHP社区的原因,比如函数命名的的不一致,比如mysql_*之类的函数,还存在一些安全性问题。我用了很多年的PHP,它还有不少陷阱,这让我也感到比较痛苦。
吐槽了半天PHP,是不是感觉很爽。
但是,如今已经快2020年,上面提到的那篇文章却写于2012年,如今人们仍然在热传和引用这篇文章,人们的视野还是像当年那样的燥动和盲目。因此我想说两句,待俺擦亮自己钛金眼镜下的土狗眼,来总结一下PHP这两年发生的变化。
PHP在近年来发生了重大的更新。比如Facebook和PHP7从HipHop到HHVM的发展,不论是PHP官方还是应用开发者都意识到了问题的重要,一直到现在你看到本文,社区和开发者一直在解决和改善这门语言。在2019年的今天,如果你仍然使用mysql_*来开发,或者把锅扔给PHP,那么你需要重新学习了。
如同地域黑一般,编程语言的鄙视链不知道啥时候出现的,不知道为什么会存在这些东西?
是的,只要有东西一旦受欢迎,火了,就会引起一些人讨厌甚至谩骂。人们讨厌Java,说太重,配置繁琐,Oracle要收钱;人们讨厌C++,难学丑陋又低级等…
现在AI和人工智能火了,Python开始被人们所追捧,有人就拿它和PHP进行比较。我对Python没有成见,Python是一个很棒的语言,与PHP一样是脚本语言,但它发明的目的就是现在流行的AI/机器学习/数据科学吗?
还有一个让我无法对Python完全接受的原因:Python运行太慢,尤其是用在网站开发上。如此说来,如果你埋怨PHP代码丑陋,我就会说Python运行缓慢。这是因为,用Python需要使用框架开发。最开始时,我只是想用Python开发一个简单的程序来跑,而Python社区推荐我用Django或Flask。我不喜欢臃肿的框架,另外在Python编程中,要小心空白或空格的坑。
别外,Python的面向对象也很有趣,它使用下划线来访问对象修饰符。有人能够理解这个声明,但我更喜欢显式的声明。Python确实是一个很棒的语言,它还有一个很棒的开发者社区,但仍然有人不喜欢它。就像我们自己觉得在任何地方都受到欢迎一样,这应该是一场美丽的误会,一定会有人不喜欢你。
另外,我个人也不是很喜欢JavaScript这个东西,当然这纯属个人观点。一些JavaScript帅哥努力游说我,Node.js现在可以充当PHP的角色,Node.js会比PHP、Java以及Python等后端语言更优秀,安全而且速度更快,我应该马上去学习Node.js,这些朋友还说是PHP发明了SQL注入,我便无语了。
回到PHP的话题。你现在手里还有PHP4甚至更早的遗留代码吗?送大家一份新的编码清单:
1、使用OOP编程
你仍然可以编写面向过程的程序,但社区已朝着面向对象的方法发展。它完全匹配新模型,可以很好地构造代码。使用面向对象,自动隐含几种简洁的编码实践,例如SOLID和DRY。
OOP可以让代码库有干净的结构,并使各部分的模块之间的分离更好。如果你坚持喜欢编写意大利面条代码,没有人拦着,你会让PHP最糟糕,然后给自己起个坏名字吧。任何编程语言都可以做到这一点。不只是PHP。
2、使用严格的数据类型
在编程时,要使用严格的数据类型。类似于:
[list=none]
[*] [/*]
[/list]
[code]declare(strict_types=1)
[/code]
静态类型可以帮助数据保持一致和安全。PHP是一种动态类型的语言,有时需要排除该特性,使用严格的类型以及更安全的路径,可以使程序在运行时避免怪异和不可预测的错误。
3、命名空间
到了PHP5.6之后,页面中include语句不再常见。使用命名空间来“import”导入需要“use”的模块。这是对原始PHP进行抽象的一种方法,即封装了include逻辑。
刚一开始,使用“/”作为命名空间分隔符是有点怪异,但是我们会慢慢习惯它。不用再使用那些require或include语句,命名空间将代码放到正确的位置。
这让我又想到了以下一些要点。
4、Artists
现在打算启动一个PHP项目,可以使用Composer,这是一个包依赖关系管理工具,可让定义扩展包的依赖关系,应用程序和测试入口点,在需要时从Packagist中央存储库中加载依赖关系。Composer会生成一个Auto Loader自动加载器,这是我们在整个项目唯一对include的调用。
5、抛弃mysql_*
mysql_* 已经存在很长一段时间,如今所有函数都已被弃用,并已经在PHP 7中已将其永久删除。如果你仍然抱怨mysql_*函数怎么不好,你该升级你的PHP版本。到目前为止,处理数据库的最佳方法是PDO与prepare联用的方式。这是一个通用API,可与大量数据库很好地配合使用。
我喜欢PDO的地方是纯净,相对现代化的设计,面向对象且一致性好。如果你刚刚开始一个PHP项目,请立即转为使用PDO。
另外,不要使用和创建DB封装程序,比如DBConnection extends PDO。如果需要通过PDO进行某种抽象,请使用Data Mapper和ORM Doctrine,不要用Active Record变体。
6、分散你的担忧
之所以今天的PHP社区出现问题,有部分原因是官方社区的新开发人员将其搞得一团糟,有时感觉比JavaScript社区更糟(我感到很抱歉)。由于PHP易于学习和入门,所以新手经常写一些hacky硬编码并部署到生产环境中。而其他编程语言没有这个能力,这是因为:
a)学习曲线更陡峭;
b)事先有着严格的设计策略;
c) 严格的部署配置标准;
我们通过分散焦点来解决这类问题。我记得初学时,曾经曾经将函数的一部分代码直接复制粘贴到其他文件中,从而完成相同的功能,只是稍稍有一些修改。我知道为什么初学者会这样干。
首先,请先给功能做减法。将代码分解成小模块,让它们独立和单一地做一件事。比如有一个User类,它不允许有创建消息,加密消息并将消息发送给其他用户等功能。
结合来自互联网的开源库,这些库发布前已经经过很好测试,能够很好地解决问题,而且做得更好。开发者应该更专注于业务逻辑,使用现有方法,不要产生紧密耦合。
7、使用PSR
最后,严格遵循编码约定,并在PHP-FIG上阅读。PHP标准建议(PSR)会让你和团队有着一致的代码库,从而方便理解与扩展,且编写与项目兼容的代码,在集成过程中的标准检查可以阻止烂代码,不会让你在写了一些代码后的3个月内大骂自己:)
此建议通常适用于每种语言。遵循编码约定并努力编写更好的代码。当然,没有人能阻止你成为“代码叛逆者”,还没有发明阻止程序员写某种代码的技术。
8、PHP在中国
PHP在2008年到2012年是一个巅峰,有Discuz、PHPWind等现今仍流行的产品,尤其是当时Facebook等明星级公司使用PHP做为开发语言,国内的门户也使用了PHP做为全部或前端语言。后来是由于移动端开发的兴起,使Web开发不再像以前可以前后通吃,这包括后端所有语言。
PHP与各种语言的互通,各种硬件的互通,仍然是最方便的语言。PHP在国内的发展,比国外要更加普及,有新的PHP运行环境polar PHP,还有协程客户端Swoole,还有PHP的内核开发者鸟哥,PHP的几大框架Laraval、YII、ThinkPHP以及CodeIgniter,有两个是中国人开发的,即YII和ThinkPHP,这些都在让PHP7开发的产品性能和效能达到更佳。
小结
仅管PHP语言很烂。但其它语言也是如此,我们只是用它们做为工具来完成任务。我不只一次看到,即便是用静态语言,二把刀的人用Java输出的也是糟糕的代码。
有一句话叫代码如诗,让自己和团队来写看起来像诗歌的程序,而不是丑陋的像打架一样的代码。
如此一来,你可以放心的用PHP启动下一个项目了,你和同事们会做更好的判断吗?同事可能太自由随便了,嗯,也许他们的代码还在编译中。现在就去做,语言是你的工具,写好产品的每行代码是你的工作。
那么问题来了,当有人再说“PHP是最好的语言”时,该怎样说?
以下是社区中的一些网友评论:
人类的爱:
很好的总结。我一直在用PHP,我们的API在PHP Slim 3框架上运行。使用了PSR、自动加载、Composer,这些对PHP社区做了重大改进。曾经,我最大的抱怨是PHP函数(尤其是字符串)参数顺序不一致。
我喜欢PHP是开放的。给桔子剥皮不只有一种方法,这就是为什么我个人讨厌自以为是的语言和框架的原因。
我喜欢可以在自选的任意Web服务器上运行它,比如在Apache的模块或Nginx的FPM上运行。
语法种子:
人们一直在引用2012年的文章!!7年的发展不该焕然一新吗?
CS老兵:
不错的文章。我都看完了,说实话,我当年写了不少非常烂的php代码,但是后来通过用Laravel框架学习OOP帮我改变了很多陋习。
DAS:
正确的结论。参数不一致是PHP的主要问题,真的需要解决。这有时真的很烦人。
但是得再说一次,用任何一种语言记住每个参数顺序都不太容易。擅用手册或者一个不错的IDE/编辑器来帮我补充是个好想法,比如PHPStorm就做得挺好。
作者:老夏
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/258076.html