PHP面向对象编程(OOP)和过程化编程的简单解释?

117

我想学习PHP并了解面向对象编程(OOP)和过程式编程(Procedural)的概念。我读过一些关于OOP vs Procedural的博客和教程,但仍无法理解这两种方法。

OOP vs Procedural

  1. 我应该学哪种?
  2. 代码上有什么区别?会产生什么影响?
  3. PHP框架如何帮助实现OOP?(我想学CodeIgniter)
  4. 过程式编程是否需要一个框架?

我真的很想知道两者之间的代码差异。我对OOP的理解是创建一个类,然后可以访问它。(我不知道这是否正确)。


6
另请参考:以下是一些相关的SO文章链接:https://dev59.com/r3RB5IYBdhLWcg3wiHll https://dev59.com/enM_5IYBdhLWcg3w-4dg https://dev59.com/ukbRa4cB1Zd3GeqP0XGI http://stackoverflow.com/questions/500475/learning-oop-well https://dev59.com/QXRC5IYBdhLWcg3wG9bp http://stackoverflow.com/questions/1608914/so-what-is-the-best-language-to-learn-oop-on https://dev59.com/8HM_5IYBdhLWcg3whzjx https://dev59.com/-nRB5IYBdhLWcg3w4bGv - dreftymac
请参见:http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/functions.html - dreftymac
请参见:http://blog.higher-order.com/blog/2009/04/27/a-critique-of-impure-reason/ - dreftymac
参见:https://duckduckgo.com/?q=simple+oop+vs+procedural&ia=web dmid://uu112xheroicsheartyx - dreftymac
参见:https://ardalis.com/encapsulation-boundaries-large-and-small/ - dreftymac
5个回答

300

背景:您要求提供一个“简单的解释”,这意味着:

  1. 您想要一个没有术语的简洁概述
  2. 您想要一些可以从头学习的东西
  3. 您发现没有两个人会以相同的方式回答这个问题,这让您感到困惑。这就是您在这里寻求简单解释的原因。是吗?

简短无术语答案:

  1. 许多介绍性的解释很快就跳进了“OOP实际世界”的例子中。那可能会使事情变得更加混乱,所以现在可以忽略它。
  2. 您可以将源代码简单地视为功能“块”,它们恰好保存在单独的文件中。
  3. 有不同的方法来组织这些“块”,这取决于编程语言的惯例、开发者的背景和培训,或者只是纯粹的个人喜好。
  4. OOP和过程式编程只是两种主要、普遍认可的方法论,用于如何组织和安排这些代码“块”。

长篇无术语答案:

过程式编程和面向对象编程只是计算机编程中一个根本问题的一个方面:如何使您的代码易于理解,并且专业地维护起来就像吃蛋糕一样容易。实际上,您可以编写遵循OOP原则的“过程式”代码,因此两者不一定相反。

一旦你学习了其他面向对象编程语言,你的理解将会得到很大提升。其中,PHP是一个“新手”。

以下是一个简要概述:在你建立经验的过程中,你将会学习到什么:

  • 您可以编写 PHP 源代码以执行有用的任务

  • 您可以将有用的任务组织成“代码块”

  • 您可以独立地思考代码“块”,而不是它们所保存的单个文件

  • 有时这些代码“块”基于传递的参数会有不同的行为

  • 接受参数的代码块称为“函数”

  • 函数可以“分块”在一起,有不同的方法:

    • 例如:您可以只有一个大的 PHP 文件,其中包含您编写的所有函数,按函数名称字母顺序排列
    • 例如:您可以有多个 PHP 文件,其中包含按主题分块的函数 [例如,用于执行基本字符串操作的函数、用于处理数组的函数、用于文件输入/输出的函数等]
  • OOP 是一种特殊的方式,可以将函数“分块”到一个“类”中

  • 类只是另一种级别的“代码块”,使您可以将其视为一个统一的整体

  • 类可以被视为方法属性“分块”

    • 方法只是逻辑上相关的函数。单词“方法”和“函数”基本上是同一件事的两个不同术语。
    • 属性只是与类相关的数据值。这些是有意非隔离到任何单个函数的值,因为多个类中的函数应该能够访问它们。
      • 例如:如果您的类具有执行天文学的各种方法,类的属性可能是所有天文学方法都需要了解的某些著名数字的值(例如 Pi、光速、特定行星之间的距离等)。
    • 这就是大多数 OOP 解释变得混乱的地方,因为它们会分支成现实世界的例子,这可能很快就会偏离主题。通常,“现实世界”是一个特定个体或群体的本体论观点的委婉说法。这往往只有在您已经足够理解概念以将其教给他人时才有用。

    • 要理解 OOP 而不混淆,您现在可以跳过“现实世界”的例子,只关注代码。类只是一种存储函数(又名方法)和属性(又名数据)的 PHP“代码块”的方式,在每个单独的“块”中处理特定的主题或功能。这就是您开始所需了解的全部内容。

    • 类很有用,因为它允许您以非常高的级别组织代码,使其易于理解、使用和维护。

    • 当有人编写了很多函数,并将它们组织成许多类,并以某种酷炫的方式使它们共同工作时,他们将整个包装起来,称之为“框架”

      参见


2
@dreftymac:你本可以给我提供一些反馈,告诉我哪些地方需要改进,而不是在背后尴尬地删除它。真的。我欢迎建设性的批评,也邀请你这样做。 - Flavius
1
@Flavius 好的。感谢你的努力,以及花时间添加内容。经过思考,你添加的部分似乎理应有一个独立的单独答案。 - dreftymac
2
另外补充一点:类还可以用于将函数数据组合在一起,这样您就不必在参数中传递它们。 - chiborg
1
+1 特别是你对“框架”这个概念的定义。我听过很多人试图解释什么是框架,但我认为你的解释是最容易理解的。 - TecBrat
1
伙计...这是我读过的关于面向对象编程和过程式编程的最好解释,而我读了很多!非常出色,真正有效、简单明了。你说得对,人们总是使用现实世界的例子来解释问题,但这并不是理解任何东西的简单方式,这是垃圾! - thechrishaddad

28

面向对象编程(OOP)仅仅是一个设计模式。如果你刚开始学习,那么要通过关注过程式方法来学习基础知识。最重要的是要熟悉基本原则,如循环、条件和调用其他过程。

在创建过程式代码时,养成将相关方法添加到单个源文件中的习惯。学会将你的过程分成逻辑单位,那么你已经开始进入面向对象的领域。基本上,对象仅仅是一组方法的集合,这些方法相互关联,因为它们操作同一组数据。这里不是说数据库,而是应用程序数据!

面向对象主要用于通过将所有内容分成简单块来使你的代码更加逻辑化。通过组合恰当的块,你可以得到一个完整的应用程序。OO不是解决所有问题的灵丹妙药或万能工具。但是它确实可以让您的代码更易于理解。

再说一遍,有些人仍然会将对象变成包含数百个方法的超大型超级对象,从而完全搞乱它们。这样的对象与常规的过程式方法没有太大区别,只是因为将大量方法组合在一起而没有任何真正的逻辑。当人们开始过于迅速地使用OOP时,这就是一个容易犯的错误。


4
我发现一些面向对象编程的代码更加令人困惑...例如尝试查看PrestaShop的内部结构。 - AndrewC
关于Pretashop的观点很好。Magento本身就是一个庞然大物,但我们决定继续使用它,因为像Pretashop或WooComm这样的替代方案甚至更糟糕。 - PKHunter

8

除了以上优秀的答案外,你应该把面向对象编程看作是你编码风格的自然发展 - 当你开始编写小程序时,可能只需要组合几行PHP代码,然后将它们分组为函数,随着编写的函数越来越多,你可能会感到需要将它们更好地组织成类。面向对象编程只是让你更好地结构化代码,从而实现更好的代码维护。


8
你应该学习两者。对象只是存在的许多可能抽象之一,而抽象是编程最终关注的内容。话虽如此,从过程性的东西开始,然后再添加对象,因为 PHP 对象的内部本质上也是过程性的。
至于框架;首先学习语言的基础知识,编写一些试验性的程序等。稍后,你可以熟悉框架,并考虑在某些情况下是否发现其中一些有用。它们绝对不是强制性的。

6

过程式php和oop使用相同的php代码。不同的是,在过程式中,您专注于一个任务即可。在oop中,您可以使用模式或块来组织代码,这些模式或块可以在代码的许多不同区域中重复使用。

简单地说,您需要了解并理解php。您可以在php.net上学习它。一旦您理解了它,就可以开始将代码组织为块。

过程式代码使用函数、变量。

一旦您掌握了要领,就可以开始将函数和变量组织成类。我们开始将函数称为方法,将变量称为属性。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接