Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 过程编程的设计模式和封装?_Php_Design Patterns_Procedural Programming - Fatal编程技术网

Php 过程编程的设计模式和封装?

Php 过程编程的设计模式和封装?,php,design-patterns,procedural-programming,Php,Design Patterns,Procedural Programming,我正在处理一个相当大的PHP项目,它是以过程式的方式编写的(它是在PHP5之前编写的),我忍不住觉得我正在做的一些事情有点“黑客化”。在其他地方进行修改很容易破坏应用程序。我看到的所有设计模式和最佳实践似乎只适用于OOP。我可以开始使用PHP5的OOP特性编写一些代码,但我不确定是否所有其他开发人员都对OOP足够熟悉 对于更熟悉OOP的人来说,过程编程的本质就是“黑客”吗?是否有一些“最佳实践”书籍涉及如何保持大型过程应用程序的可维护性,并减少引入新bug的可能性 我知道我可以以过程的方式应用O

我正在处理一个相当大的PHP项目,它是以过程式的方式编写的(它是在PHP5之前编写的),我忍不住觉得我正在做的一些事情有点“黑客化”。在其他地方进行修改很容易破坏应用程序。我看到的所有设计模式和最佳实践似乎只适用于OOP。我可以开始使用PHP5的OOP特性编写一些代码,但我不确定是否所有其他开发人员都对OOP足够熟悉

对于更熟悉OOP的人来说,过程编程的本质就是“黑客”吗?是否有一些“最佳实践”书籍涉及如何保持大型过程应用程序的可维护性,并减少引入新bug的可能性


我知道我可以以过程的方式应用OOP设计原则/模式,但如果我要这样做,我还不如使用PHP的OOP特性。也许我只是对过程范式的理解不够好?

过程编程,特别是在PHP中,没有“封装”的具体概念——一切都是可用的,只是修改它不是你的工作,所以你没有。对于那些除了OOP之外什么都不懂的人,或者被教导过程代码是Baaaaad的人来说,是的,它可能看起来很粗糙而且是错误的。但是人们已经做了很长一段时间了,而且它确实有效

现在,您很可能已经发现了一些实际上很糟糕的过程代码。它的数量和糟糕的OOP代码一样多


过程代码的基本实践与面向对象的基本实践并没有太大区别——尽可能避免全局性的,将相关函数分组在一起并尽量保持简短。就其本身而言,并没有真正的“模式”,因为过程编程比模式运动早了几十年。但是干净的过程代码不必像OOP狂热者所相信的那样难看。

我的过程代码实际上看起来很糟糕。我经常使用传递复合结构的函数,例如$page。如果需要的话,将任何set_title($page,$title)转换为$page->set_title($title)将非常简单。这只是一种不同的表示法,在方法的实现上没有实际的区别

设计模式是一个广泛的领域。如果应用于过程代码,肯定会有一些事情看起来很愚蠢。坦率地说,一些面向对象设计模式在基于类的代码中也不是很明智。但是,如果有一个明确的重写继承的代码库的用例,请尝试一下。我怀疑你的编程伙伴们对对象结构接口过敏

听起来,应用程序中的问题似乎源于陈旧而复杂的结构。如果它是以PHP3风格编写的,例如仍然使用$HTTP_GET_VARS,那么不要尝试。然而,如果它只是全局变量和依赖的代码状态,那么引入一些对象结构是可行的


全局变量:OOP中的单例只是过于复杂的全局变量。大多数应用程序需要一系列配置设置(只是读取,从不写入)。它们属于全局对象或数组。其他一切都是危险的。

即使只说一次“类”,也可以执行OOP。过程代码的要点不是你没有使用类;这是因为数据是“需要操纵的东西”,而不是具有自身身份的对象。GDK是相当面向对象的,并且是用C编写的。查看以下帖子: