为什么说PHP是很糟糕的,也是很好的编程语言

046ca34cc96d550f01d4327fbfdd475b.png

点击上方蓝字关注我,了解更多咨询

6eab755d774c70a10c3804c57b336b6a.png

PHP 又是一门相当奇怪的编程语言。当人们抱怨这门语言“很糟糕”时,他们并没有说错。这门语言确实有很多不好的地方。

979536dabf95a18f34e30f6b95b78060.png

搁在以前,这门语言还有更多糟糕的问题。嘲笑 PHP 的博文《全面解析 PHP 的糟糕设计》(PHP: a fractal of bad design)确实有几个正确的观点,即使这些观点在九年前发表时就已经过时了。

然而,与此同时,开发人员却可以利用 PHP 创建结构上“正确”的软件,并从其他语言中引入被视为良好实践的哲学。

像 Laminas 和 Symfony 这样的框架就使用了面向对象编程的最佳实践,使开发者可以用这些框架编写结构正确的代码。

PHP 是怎么做到这些的?这是因为 PHP 是最糟糕的编程语言。

设计软件

1991 年,Richard P. Gabriel 发表了一篇文章《Lisp:好消息,坏消息,如何赢得大》(Lisp: Good News, Bad News, How to Win Big)。这篇文章的论点是,在软件设计和寿命方面,“更糟就是更好”的哲学将是更好的选择。

他之所以得出这一结论,是因为他意识到出现了两种不同的程序设计流派,他分别将之命名为“麻省理工学院 / 斯坦福风格”(MIT/Standford Style),或者“正确的方式”,以及“新泽西风格”(New Jersey Style)或者“更糟就是更好”。

这两种哲学的目标相似,但在关键领域却有所不同。两种风格都侧重于哲学理念的四个关键领域:简单性(Simplicity)、正确性(Correctness)、一致性(Consistency)和完整性(Completeness)。

麻省理工学院风格是这样描述的:

  • 简单性:设计一定要简单,不论它的实现还是接口,都一定要简单。相较而言,让接口保持简单更重要。

  • 正确性:在所有可以观察到的方方面面,设计一定要正确。不要妄想做一个不正确的设计。

  • 一致性:设计一定不能是不一致的。为了确保一致性,你可以略微牺牲简单性和完整性。一致性和正确性同等重要。

  • 完整性:设计一定要尽可能多地涵盖重要的情况。所有符合预期的情况一定要被覆盖到。完整性优先级应该高于简单性。

至于新泽西风格,Gabriel 说,它将其目标定义为:

  • 简单性:设计一定要简单,不论它的实现还是接口,都一定要简单。而相较而言,让实现保持简单更重要。简单是最重要的,其他的特性都不如保持简单更重要。

  • 正确性:在所有可以观察到的方面,设计一定要正确。但是可以为了简单而轻微牺牲正确性。

  • 一致性:设计一定不能太过不一致。某些情况下,为了保证简单可以牺牲一致性。如果将某个不常见的情况引入设计,会导致实现变复杂或者不一致,那么就不要考虑这种情况。

  • 完整性:设计一定要尽可能多地涵盖重要的情况。所有符合预期的情况一定要被覆盖到。完整性可以为任何其他特性让步。实际上,一旦威胁到实现的简单性,完整性必须要被牺牲。如果为了保持简单,可以牺牲一致性来实现完整性;尤其是接口的一致性。

这场争论的关键是用 LISP 和 C 作为例子来说明为什么“更糟就是更好”。对于 LISP 程序员 Gabriel 来说,LISP 是一种比 C 更好的语言,速度和 C 一样快,而且 Common LISP 的设计、开发和标准化已经花了很多年。

定义该语言的规范吸取了所有不同的 LISP 的精华,而现代开发环境对于 LISP 开发者来说是最好的。

LISP 是正确的方式

LISP 代表了软件开发的“正确的方式”。LISP 易于交互,你可以通过各种方式与它交互。希望从 Fortran 中调用 LISP?

你可以从 Fortran 中调用 LISP 并将数据传入,反之亦然。在使用遗留代码时,你可以愉快地使用 LISP 的所有现代“豪华”特性。

LISP 拥有一致的设计,这得益于它的规范。假如你研究一下 Python 这样的现代语言,规范在提供多个后端和编译器方面有很大的作用,而且它们都以同样的方式解释或编译代码。

这些工具是一流的,1991 年的 LISP 拥有我们今天仍然享受的所有舒适,比如步骤调试、数据检查和花哨的编辑器。

作为一种语言,LISP 是完备的。它具有先进的面向对象编程层、多重继承、一流的对象以及函数和类型。LISP 似乎是开发人员心中想要的编程语言。

1991 年,LISP 这门编程语言可能处于有史以来的最佳状态。这种技术上的正确性并没有被实际使用所证实。

LISP 的开发商正在衰退。多年来负面新闻和错误定位阻碍了 LISP 的外部声誉。人们不再将其视为向最终用户交付软件的方式。

就开发而言,LISP 往往代表着许多与“大规模预先设计”(Big Design Up Front,BDUF)一样的理想。

假如你曾经使用过瀑布模型(Waterfall Model)这样的设计方法,你就会发现一些问题。“正确的方式”非常强调一致性、正确性,并确保考虑到所有能想到的问题。

LISP 本身并非一种单一的语言,而是一个语言家族。尽管 Common LISP 被设计成一种标准,但是 LISP 本身的实现方式是根据需要完成的各种工作而存在的。

Lockless Inc 网站上的一篇文章指出,这种“碎片化”是 LISP 最终失败的决定因素之一。尽管 LISP 坚持软件设计的“正确的方式”,但是这种碎片化导致代码维护和可移植性都受到了影响。

PHP 是最糟糕的

因此,“更糟就是更好”的软件首先会被接受,其次它会使用户期望更少,第三,这些软件将被不断改进,直到接近“正确的方法”的程度。——Richard Gabrie

在这一启示的几年后,Rasmus Lerdorf 开始研究个人主页 / 表单解释器,也就是我们现在所知的 PHP。

PHP/FI 的诞生是因为 Lerdorf 需要维护他的主页,并与表单和数据库进行交互。PHP/FI 甚至不是作为一种实际的编程语言设计的,而是作为 C 语言之上的一层脚本和函数设计的。

PHP 很简单

设计一定要简单,不论是它的实现还是接口。

PHP 底层使用了 C 语言,我们之前已经说过,这部分是“最糟糕的”。然而,这也带来了一些优势,最重要的是,更简单的底层语言可以让它更容易扩展。虽然 Hack/HHVM 采用了更多的 C++ 方法,但 PHP 本身仍然是 C 语言。

只需短短几个小时就能学完这门语言的内部结构。Elizabeth Smith 发表过一篇关于 PHP 扩展的精彩演讲,其中介绍了大量关于 PHP 的内部工作原理。这门语言本身借鉴了其他 C 风格的语言,不仅易于阅读,并且能够跟 C 风格的其他语言互相转换。

PHP 的大多数接口,或者说标准库,都非常简单,因为大多数核心功能都只不过是包装了各种 C 语言库,然后几乎原封不动地公开出来。尽管这样做会导致接口上的一些不一致,但是它为来自 C 或 C++ 的开发者提供了一个熟悉的环境。

PHP 语言非常注重于 Web 开发。将 HTTP 中的概念提取出来并在语言中找到相似的概念通常非常简单。希望了解一个请求的头信息吗?get_headers() 就能满足你。获取请求信息就像读取 _POST 全局变量一样简单。

PHP 保持了简单的开发者接口,并且尽可能地保持内部结构的简单。

PHP(几乎)是正确的

在所有可以观察到的方面,设计一定要正确。但是可以为了简单性而轻微牺牲正确性。

在这里,PHP 倾向于选择“简单”而不是正确。在 HHVM 出现之前,语言的外观和特性一直没有得到规范。

Zend 解释器本身就是规范,并且这门语言的行为方式总是 “正确”的(不包括实际的错误)。要想用别的东西代替 PHP 引擎,就必须实现现有引擎的所有特性。

许多核心函数的 LAX 函数参数和返回类型都使得系统的工作更容易。像 strpos() 这样的函数返回值可以是整型数或布尔值,相对于严格设计成返回整型数或抛出异常的方法,处理要稍微容易一些。

看 PHP 语言的发展,几乎所有新特性都是建立在开发人员需要的基础上,而不是“因为它错了所以必须修复”的严肃想法。

更多地关注那些严格类型和异常错误是一种更正确的做事方法。然而,还有一些东西,比如简短的箭头函数(arrow function)、属性和枚举,才是开发者想要用来简化代码的东西。

PHP 不需要一致性

设计一定不能太过不一致。某些情况下,为了保持简单可以牺牲一致性。

我甚至不打算假装 PHP 是一致的,但是它的一致性已经足够了。当涉及到数组与字符串函数时,人们可能会抱怨 needle/haystack 参数顺序。

不过,一般而言,数组函数是一致的,而字符串函数也是一致的。与底层 C 库保持一致比在语言中保持一致要简单得多。

PHP 在其他方面也足够一致。正如我在 strpos() 中提到的,PHP 对于遇到错误的函数往往会相当一致地返回 FALSE。这未必是正确的,但它却是一致的。带下划线和不带下划线的函数名通常都会匹配其基础库。

为了简单起见, PHP 语言牺牲了一致性,但是即使没有这个规范,它仍然努力在有意义的地方保持一致。

PHP 的完整性符合所需

设计一定要尽可能多地涵盖重要的情况。

无论何时,在针对 PHP 需求最大的设计任务:编写 Web 应用程序时,PHP 都是完备的。PHP 从未被设计成一种可以适用于编程世界所有问题的语言。

尽管如此,它的简单性还是使它可以用于 Web 以外的场合。PHP 最初的目的就是为 Web 编程提供最基本的功能,这一趋势一直持续至今。

修改核心语言通常是由开发人员的需求驱动。整个社区提出修改意见,然后经由社区投票,决定新特性被拒绝、改变或者接受。该语言的许多创新都源于快速完成工作的需要。

即便我们吸收了其它语言的功能,也是因为它使我们的开发变得简单,而很少是因为其他语言做得“更正确”。

今天,你可以用 PHP 开发 Web 应用程序。五年后,你仍然可以用 PHP 开发 Web 应用程序,只不过会增加一些新特性。

但是,语言本身的完整性已经符合今天所需。如果未来有需要,我们可以随时修改语言或为它添加新功能。

更糟就是更好吗?

Gabriel 承认,“更糟就是更好”的哲学指的是设计看起来很糟糕,也许不应该作为更好的选择。唯一的问题是,当他审视这两种哲学时,与麻省理工学院 /“正确的方式”的设计哲学相比,“更糟就是更好”最终仍然是更灵活的选择,“具有更好的生存特性”。如果我们看一下 PHP,就可以证实“更糟就是更好”这一观点。

这些年来,Gabriel 承认他在哪种方式更好之间摇摆不定。PHP 社区一直在争论我们是应该正确地做事还是继续简单地做事。

我们有像 Laminas 这样的框架,以经典的计算机科学方式构建库,然后我们有像 Laravel 这样的框架,关注开发者的体验和速度。PHP 本身二者兼具。

下次再听到有人骂 PHP 的时候,就随他喷去吧。这门语言确实很糟糕。但从许多方面来看,PHP 的长寿和广泛使用证明了这样一个事实:用“正确的方式”做事并不总是比用“最糟糕”的方式做事好。

当有人吐槽你正在使用的框架时,你要明白从长远来看这并不重要。选择一种你认为适合自己的设计哲学,并欣然接受这一点:更糟的可能实际上是更好。


7c7628e38632ca71365cd1515e6e3333.png

END

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

d2df80657d24461730c7a25161da351b.png

bc6a72997efde3e08dc948199a61eab3.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Objective-C学习中对 C语言的扩展

点击上方蓝字关注我,了解更多咨询Objective-C学习中对 C 的扩展是本文要介绍的内容,Objective-C和Cocoa是苹果公司Mac OS X操作系统的核心。Objective-C语言是C语言的一个扩展集,许多具备Mac OS X外观的应用程序都是使用该语言开发的。Cocoa是…

神武4手游服务器维护,神武4手游 本周新手服限服开启 !

《神武4》手游新老玩家互动福利新手服即将于本周在天下无双、二〇二〇、见龙在田限服开启,通过“老带新”模式,助力萌新玩家快乐成长的同时,也为老玩家送出更多福利好礼。【《神武4》手游新手服限服开启 】服务器等级≥65且自身等级≥69级的玩…

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View,Mo…

织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题

最近在工作中遇到一个问题,用织梦搭建好的网站,在本地上测试没问题但是上传到正式服务器上就出问题了,在后台登陆的时候,验证码的图片老是显示不出来,后来查阅了相关资料才终于找到问题的根本原因,下面就分…

Python与C语言的区别是什么?

点击上方蓝字关注我,了解更多咨询Python与C语言的区别是什么?Python是由C语言实现,C语言是编译型语言,经过编译后生成机器码再运行,执行速度快不能跨平台,一般用于操作系统驱动等底层开发。Python是理解为解释型语言执…

C语言数据类型从计算机原理的角度是怎样看待的?

点击上方蓝字关注我,了解更多咨询初学C语言,首先要接触的就是数据类型了,这也是学习任何一门语言所必须经历的阶段。很多同学在学习的时候不理解数据类型,因为对计算机及原理知之甚少。所以,在学习数据类型之前&#x…

android module中获取 app_Android组件化架构 - 4. 动态创建

Android 组件化中使用动态创建的作用是解耦;1. 反射机制反射有两个作用:1.反编译:.class->.java;2.通过反射机制访问java对象中的属性,方法,构造器等;实现反射,实际上是得到Class对象2. 动态…

小白适用的C语言数据类型转换及转换规则

点击上方蓝字关注我,了解更多咨询1.不同类型数据间的混合运算与类型转换:①若参与运算量的类型不同,则先转换成同一类型,然后进行运算②转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时&#x…

jax-ws和jax-rs_带有JAX-RS和PrimeFaces的RESTful图表

jax-ws和jax-rs通常,利用图表提供数据的直观表示很有用。 PrimeFaces提供制图解决方案,可轻松将数据的可视表示形式添加到Web和移动应用程序中。 如果我们将PrimeFaces图表组件的使用与RESTful Web服务数据结合在一起,我们可以创建自定义图表…

udp 使用connect优点_nodejs源码分析第十九章 -- udp模块

udp不是面向连接的协议,所以使用上会比tcp简单,他和tcp一样,使用四元组来标记通信的双方(单播的情况下)。我们看看udp作为服务器和客户端的时候的流程。1 在c语言中使用udp1.1 服务器流程(伪代码&#xff0…

C语言与Java的对比,你想好选谁了吗?

点击上方蓝字关注我,了解更多咨询很多同学纠结自己应该学C语言还是学Java,本篇文章带你细致了解C语言与Java的各方面的不同之处,让你能够更全面的把握编程语言!1.Java与C语言各自的优势C语言是面向过程的语言,执行效率…

C语言:初始C语言

点击上方蓝字关注我,了解更多咨询什么是C语言为什么学习C语言?第一个C语言程序什么是C语言说到语言,可能会想到汉语,英语这些人与人之间交流的语言,语言是人与人之间沟通的桥梁,通过语言,我们得…

apache camel_带有调试器的Apache Camel Eclipse工具

apache camel大约2个月前, Lars Heineman在 JBoss工具堆栈中写了关于改进的Apache Camel Eclipse工具的博客。 在即将发布的版本中,他们将Camel调试器与本机Eclipse调试器集成在一起,因此当您使用断点时,您将获得Eclipse调试体验…

服务器皮肤在哪个文件里,服务器怎么使用皮肤

服务器怎么使用皮肤 内容精选换一换在使用云服务器备份制作的整机镜像创建弹性云服务器时,创建速度很慢,或者界面提示用户:该镜像不支持快速创建云服务器功能。CSBS服务早期提供的老备份格式无法支持快速创建云服务器,因此&#x…

c语言中?:的用法

点击上方蓝字关注我&#xff0c;了解更多咨询?:是C语言中的三目运算符&#xff0c;可以用来替代 if—else 语句。?:的使用方法为&#xff1a;<表达式1>?<表达式2>:<表达式3>它是对第一个表达式作真/假检测&#xff0c;然后根据结果返回另外两个表达式中的…

字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗

我们先来看个例子&#xff1a;public class StringTest { public static void main(String[] args) { String a "A"; String b new String("A"); System.out.println(a b); // false String c b.intern(); Syst…

http协议下需要服务器推送吗,HTTP/2.0 服务器推送实现

前言HTTP/2.0发布于2015年&#xff0c;作为新一代HTTP协议&#xff0c;其由于推进互联网加密技术的使用&#xff0c;所以只能作用于https连接当中。HTTP/2.0提供HTTP语义的有效序列化&#xff0c;是一个二进制协议&#xff0c;所有的框架开始一个8字节的头&#xff0c;紧跟着的…

C语言最常用的编译器

点击上方蓝字关注我&#xff0c;了解更多咨询对于大部分工科类专业的学生来说&#xff0c;如果说是需要学习c语言的话&#xff0c;那选择编译器就是我们第一个遇到的问题了&#xff0c;这一类软件有很多&#xff0c;每一个软件都有他各自的优点&#xff0c;当然了也有他各自的缺…

word一键生成ppt 分页_如何一键把Word转换为PPT?

看到评论区有人问可以一键转换吗&#xff1f;当然可以&#xff0c;比如简单好用的【迅捷PDF转换器】迅捷PDF转换器 - 多功能的PDF转换成Word|JPG|PPT转换器安装打开软件之后&#xff0c;在PDF转换栏目下&#xff0c;点击PDF转换其它&#xff0c;就可以看到文件格式转PPT&#x…

jboss4 迁移_JBoss BPM Travel Agency的微服务迁移故事

jboss4 迁移不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍…