PHP错误的方式

2020-08-05 16:48:13

在PHP编程领域,一些人(在他们的书中和网站上)将一组趋势大量宣传为“现代PHP”,而所有其他方法都被认为是落后、愚蠢或完全错误的。

这些人似乎不知疲倦地让其他人效仿他们的做事方式。

创建此网站的目的是为了呈现对PHP编程的务实观点。由经验和实际结果决定的观点,而不是流行的趋势、理论或学术教条。

网站PHP-错误的方式是一个活生生的文档,并将继续更新更多的信息,当它变得可用时。

编程规则和准则的一个问题是,它们通常只在特定上下文中服务于某个目的。断章取义,一条好的规则可能会变成一条可怕的规则。事实上,每条好的规则在走向极端时都会变得不好。

理解这一点很重要,因为随着时间的推移,由许多不同的人提出的许多软件开发原则和规则经常会在极端分子手中被滥用。

经验告诉我们,滥用一般规则和准则总是会导致复杂化、缺乏安全性、容易出错,在某些情况下甚至是彻底的灾难。

KISS原则是“保持简单,愚蠢”的首字母缩写,它是一个非常明智和好的原则,被有经验的人普遍认为是非常好的建议来遵循。但是,即使是这个伟大的原则,如果走到极端,也会对项目构成危险。有这样一种“太简单”的东西,导致缺乏所需的功能。

在PHP社区,一个非常糟糕的趋势已经成为开发Web应用程序的事实上的标准,那就是使用流行的通用框架。

这一趋势的出现和流行并不是因为它以任何方式改进了开发过程的结果,也不是因为从技术和体系结构的角度来看它是正确的。这一趋势之所以流行起来,是因为一些框架开发人员用诸如“不要重新发明轮子!”之类的诗节,成功地用他们反对编程的论战彻底扫除了大众。还有“不要自己动手,别人比你技术好”。

今天的许多程序员完全忽视了声音编程的基本原则,他们花费大量时间幻想新的复杂层次,以便显得更聪明、更酷,更容易被他们认为是同龄人的人接受。

这些人似乎痴迷于让其他人效仿他们的“做事方式”,成为某种PHP社区领袖,让其他人使用他们最新的“时髦”开放源码工具,以至于他们忘记了确保他们提供的建议是健全和可靠的。

在软件行业中,您可以将预建房屋与通用框架进行比较。使用通用框架构建软件并不会使您成为程序员或程序员,就像组装预建的房屋不会使您成为木匠一样。

库被认为是可重用代码的集合,就像C标准库或Go标准库一样。它由代码组成,您可以轻松地将这些代码集成到您自己的项目中,而不会强制执行任何限制或约束。它由一小段代码组成,每段代码都有一个特定的功能。

框架不仅仅是可重用代码的集合:您不能简单地从框架中提取一段代码并将其集成到您自己的项目中。框架是一个帮助您构建软件的系统,但同时它迫使您在框架本身的限制和约束下工作。框架本身有很多相互依赖的功能。一件没有另一件就不能工作。

在Python和Ruby的世界里,从头开始构建网站是一件令人厌烦的事情,因为Python和Ruby最初都不是用来构建网站的。因此,Django和Ruby on rails等通用框架在用这些语言构建网站时迅速流行起来。

另一方面,PHP最初是由Rasmus Lerdorf创建的,它是一组用C编写的工具,使您能够轻松快速地开发动态HTML。就其本身而言,PHP过去是,现在仍然是一个框架。

从那时起,PHP发生了巨大的变化,今天,PHP不仅仅可以用来构建HTML和网站,但将PHP本身视为一种框架并不是错误的。PHP本质上是用于开发完全用过程性C编写的Web应用程序的抽象层。

在项目中使用库是很自然的。PHP本身捆绑了一组库,您可以使用这些库来扩展您自己的代码。例如,PDO是一个轻量级的库,它为在PHP中访问数据库提供了一致的接口。

另一方面,使用PHP之上的框架则完全是另一回事。

当您在PHP中使用框架时,您需要在另一个抽象层之上添加一个抽象层,这个抽象层一开始就已经存在,供您使用。框架提供的附加抽象层可能只是用来将代码组织到一组预先固定的模式中,或者它可能会通过将数百个甚至数千个类和方法交织成一个依赖的噩梦而增加更多的复杂性,无论哪种方式,都是在向您的代码添加不需要的复杂性层!

所有体验都从界面开始。界面体验是底层技术和抽象层数量的结果。您使用的抽象越多,接口的效率就越低,应用程序就越容易出错。抽象程度越高,损失的细节和效率就越多。

清楚地理解这一点:任何项目中理想的代码行数都是尽可能少的,同时又尽可能清晰易读!

并不是每个人都需要通用的框架。没有人有普遍的问题,每个人都有他们试图解决的非常具体的问题。

一些公司开始听到关于PHP框架的炒作,他们开始他们的下一个项目时使用了这些流行的通用框架中的一个,结果却以一场灾难告终。他们不仅发现通用框架在解决他们非常具体的需求方面真的很差,而且在解决这一问题上也极其缓慢。这是不可能扩大规模的,结果他们开始撕裂框架,不顾一切地试图拉出所有他们真正不需要的东西。

出于对直接实际后果的考虑而不是由理论或教条决定的行动或政策。

我对象牙塔的设计和设计模式有很大的过敏。Peter Norvig,当他在Harlequin时,他做了一篇关于设计模式是如何真正成为编程语言中的缺陷的论文。找一种更好的编程语言。他说的完全正确。崇拜模式,然后想,“哦,我会用X模式。”

在软件工程中,设计模式是对软件设计中常见问题的可重用解决方案。设计模式不是可以直接转换为代码的已完成设计。它是对如何解决问题的描述或想法,可以在许多不同的情况下使用。面向对象的设计模式通常显示类或对象之间的关系和交互,而不指定所涉及的最终应用程序类或对象。

PHP支持命令式、函数式、面向对象、过程性和反思性范例。PHP是一个巨大的工具箱,包含许多不同的工具,可以用多种不同的方式解决许多问题,而不仅仅是一种方式。

PHP完全是关于自由、快速和可伸缩的解决方案,并且有许多不同的方法来处理问题。

当我们试图改进自己时,在这种情况下,更具体地说是我们的代码,我们有时会沉迷于特定模式或想法的哲学,而往往忘记实际思考。

当我在我的程序中看到模式时,我认为这是有麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规则都是一个迹象,至少对我来说,这表明我使用的抽象不够强大-通常是我手动生成需要编写的某些宏的展开。

我们不应该过于沉迷于特定模式或解决方案背后的哲学或思想。我们主要关注的是尽可能使代码易于导航和理解,从而使代码易于维护和安全。

我们还必须记住,确实存在反模式这样的东西。这是一种可能常用的模式,但在实践中是无效的和/或适得其反的。

我认为模式一开始是公认的常见问题的最佳解决方案。但是现在它们已经存在了一段时间,我们已经体验到应用程序比需要的复杂十倍,因为人们试图塞进他们读到的所有模式(“我的应用程序架构很好,因为它是用模式加载到鳃上的”)。我对图案价值的印象发生了一些变化。

出于对直接实际后果的考虑而不是由理论或教条决定的行动或政策。

面向对象语言的问题是它们有所有这些隐含的环境,它们随身携带。你想要一根香蕉,但你得到的是一只大猩猩拿着香蕉和整个丛林。

抽象是强大的。我真正过敏的是CORBA,COM,DCOM,面向对象的废话,我在90年代对此有反应。当时的每个初创公司都有一些疯狂的事情,需要200.000个方法调用才能启动并打印“Hello world”。这太讽刺了!你不会想成为与这类事情相关的程序员的。

许多软件开发人员和许多公司认为,面向对象编程是当今开发软件的唯一合理方式。任何反对面向对象编程的人都会立即意识到他们是在反对业界的“传统智慧”。

在编程博客和论坛上,有很多人为面向对象编程辩护,尽管没有任何标准定义,但他们确信自己知道自己在说什么!

事实是,所谓的面向对象编程本身通常会造成不必要的复杂性的沉重负担!

作为计算机科学家和程序员,我们必须学会抛开偏见,找到解决特定问题的最佳方案。

今天,PHP的主要优势之一是它同时支持命令式、函数式、面向对象、过程性和反思性范例。PHP是一个巨大的工具箱,有很多不同的工具,可以用很多不同的方式解决很多问题,而不仅仅是一种方式!

一旦我们试图将应用程序中的不同问题强制提供给单个特定的编程范例,我们就没有创造性地思考,我们的工作效率也不高!

理解特定编程范例的最好方法之一就是看看它最初是如何演变的。它发展的原因是什么?其他编程范例存在哪些需要新的思维方式的问题?这是一个现实世界的问题,还是仅仅是一个学术问题?从那以后,它又是如何演变的呢?

X说什么或Y给出什么定义并不重要,在范式的背景下,重要的是创造它们的历史。

构建软件设计有两种方法。一种方法是让它变得简单,显然没有任何不足之处。另一种方法是把它弄得很复杂,这样就没有明显的不足之处了。

过去,在面向对象编程出现之前,大约在五十年代末,许多软件都是使用强调非结构化编程的编程语言开发的,有时称为第一代和第二代语言。历史上,非结构化编程(或称非结构化编程)是最早的编程范例。它因产生“意大利面”代码而受到严厉批评。

既有使用非结构化编程的高级编程语言,也有使用非结构化编程的低级编程语言。其中包括BASIC、COBOL、MUPS、JOSS、Focus、TELCOMP、机器级代码、早期汇编系统(没有过程性元运算符的系统)和一些脚本语言的早期版本。

非结构化语言的程序通常由顺序排列的命令或语句组成,通常每行一个。这些行通常是有编号的,或者可能有标签,允许执行流跳到程序中的任何行(就像不受欢迎的goto语句一样)。

然后,在60年代,结构化编程出现了--主要是由于Edsger W.Dijkstra写的一封著名的信,信中提到了被认为有害的语句。

结构化编程是一种编程范例,它通过使用子例程、块结构和循环来提高软件的清晰度、质量和开发。这与使用简单的跳转(如GOTO语句)形成对比。

后来,过程编程从结构化编程派生出来。过程性编程基于“过程调用”的概念。“过程调用”只是“函数调用”的另一个名称。过程也称为例程、子例程或方法。一个过程仅仅包含要执行的一系列计算步骤。任何给定的过程都可以在程序执行期间的任何时刻调用,包括由其他过程或其自身调用。

在开始时,所有程序都可以作为全局数据提供给程序的任何部分。在小程序中,这并不是问题,但是随着事情变得更加复杂,随着程序大小的增长,对程序一部分的微小更改将极大地影响其他许多部分。

没有人计划在程序中进行更改,并且存在许多依赖项。对一个过程的微小更改将导致依赖于原始代码的许多其他过程中的一连串错误。

一种新的技术发展起来,它允许将数据划分成称为“对象”的独立作用域。只有属于相同作用域的特定过程才能访问相同的数据。这称为数据隐藏或封装。结果是更好地组织了代码。

在开始时,对象不被称为对象,它们只是被视为单独的作用域。后来,当依赖性降低,这些作用域内的过程和变量之间的连接被视为孤立的段时,结果就产生了“对象”和“面向对象编程”的概念。

后来,主要由于Java的发展,出现了某些“流行语”,“过程”或“函数”不再称为函数,而是在驻留在单独的作用域中时被重命名为“方法”。变量也不再称为“变量”,而是当它们驻留在单独的作用域中时被重命名为“属性”。

因此,对象本质上只是函数和变量的集合,现在称为“方法和属性”。

在单独的作用域中隔离方法和属性的方式是使用“类”。类一旦实例化,就称为对象。

对象可以相互引用,通过这样的引用,内部的方法(函数)可以相互“通信”。对象也可以从其他对象“继承”方法,从而扩展这样的方法,这称为“继承”。它是一种重用代码的方式,并允许通过公共类和接口对软件进行独立扩展。对象之间的关系形成了层次结构。继承是1967年为编程语言Simula67发明的。

对象还可以继承其他对象的方法,并用添加或更改的功能“覆盖”这些方法,这称为“多态性”。

面向对象编程是关于以与以前不同的方式组织代码。它是过程性编程的扩展,它是关于隐藏数据(封装)和避免全局作用域的。它是关于通过“借用”它们的蓝图来扩展函数,而不会实际影响原始代码(继承)。它是关于在不影响原始代码(多态性)的情况下覆盖函数。

面向对象的模型使得通过增加来构建程序变得容易。这通常意味着,在实践中,它提供了一种结构化的方式来编写意大利面条代码。

对于框架的使用,经常表达的一个论点是,人们不想处理其他人从头开始编写的代码库。

然而,这是一种奇怪的心态,主要是在PHP社区的Web开发人员中遇到的。它散发着缺乏专业精神和经验的气息。

写软件和处理别人的代码是正常的。这是专业程序员日常工作的一部分。这不是什么可怕的事。

一个专业的程序员不会看着别人的代码,开始抱怨他或她如何完全受制于前程序员,后者可能不再与公司或项目有关联,如果前程序员使用框架A或框架B,情况就会有所改观。

也许PHP web开发的低门槛是造成这种心态的原因之一。无论如何,这是一个人从事错误工作的标志。

编程的很大一部分涉及到人们必须使用其他人的代码。这是试图改进现有代码库的工作的一部分,有时需要完全重写。

请注意来自编程大师的笔记,请阅读“工作中的编码员--对编程技巧的思考”这本书。

世界上一些最大和最成功的代码库是由数百个从未谋面的人开发的代码库,开发的代码库没有使用任何类型的框架,代码库完全在过程性编程语言中完成,没有使用过程性范例,他们做梦也不会想要用不同的方式来做这件事。

Linux内核由2000多万行代码组成,所有代码都是由14000000多名 参与者完全使用过程性编程编写的,没有使用任何类型的框架。

不同的BSD风格和大多数Linux GNU用户区都是完全使用过程性编程编写的,而不使用任何类型的框架。

世界各地数以百计的开源项目也是如此,这些项目最终被最初的程序员抛弃,却被其他熟练的程序员接手。其中许多项目几乎没有文档(如果有的话),代码库中没有注释,也没有任何指导方针或帮助可供提供。

整个PHP代码库都是用纯过程编程语言C完成的,没有使用任何类型的框架。

无论何时您用PHP定义一个类,或者每当您启动您最喜欢的PHP框架时,您都是在别人的纯过程性工作上运行!

当然,确实存在可怕的代码,可能从一开始就不是设计好的代码,或者代码可能已经超出了自身的许多倍,但是客户端不想处理重写,代码非常糟糕,以至于你不能再理解它,但是任何一种框架都不能防止这种情况发生。这通常是一个程序的自然成长过程。最终,不管怎样,任何一种框架都会被撕碎。

当然,确实存在可怕的意大利面代码,但没有人故意制造可怕的意大利面代码。有时这是由于。

.