php - 为什么要在php中使用类?

标签 php oop software-design

我想知道为什么我们在php中使用类。我在所有开放源代码中都看到过,它们使用类来执行查询。这意味着它们使用类来获取结果,插入查询等。我认为这用于一致性和加速,但是据我所知,如果我们使用mysql_query()执行查询,而不是创建对象链接,那么$db->query与第二个相比将执行得更快,因为在对象中,它将转到该函数,然后在该函数处执行,然后返回结果,但是如果使用mysql_query(),它将在同一位置执行查询。因此,我认为mysql_query()将快速执行。那么为什么我们使用类和对象来执行查询,使用类有什么好处呢?

最佳答案

封装:类是一个有用的数据包,其中包含代码和相关数据,并与其他所有内容隔离。这使得在不搜索确切变量的情况下轻松移动它,而不会与现有代码/数据发生冲突。

当然,类还有其他用途,但在PHP之类的脚本环境中,我认为最大的好处是。

编辑:我反对“继承比封装更强大”的论点。我认为这不适用于脚本和Web场景,我将尝试解释原因:

第一个,网页的生存期是一个请求/响应对,最好少于一秒钟。状态通常保存在外部实体( session ,Cookie,数据库等)中。由于页面的生命周期非常短,因此网页代码中的可能状态少于胖客户端。几乎总是一小段代码连续运行并完成工作。可以说,就简单性和设计参数数量而言,网页可与控制台应用程序相提并论。尽管某种形式的输入参数的数量可以是千兆字节,但UI元素和输入参数之间的关系仅限于屏幕分辨率,即用户可以一次填写的内容的整体功能。因此,在大多数情况下,我们的输入参数数量很少,意味着状态数量更少。当然,在组合和“可变”的世界中,这不是真的,但是在“典型的Web应用程序”的情况下,内部状态也很小,因此使我的主张合理。

Web应用程序中的输入和输出基本相同:输入是查询参数或表单数据,输出是HTML文档。因此,在较短的生命周期中,输入处理和输出生产代码的形状和设计都适用于网页。我知道我在图片中省略了很大一部分“业务逻辑”,我将继续讨论。但是,请确保我们在代码的这些部分中没有使用OOP的漂亮功能,例如“多态”和“继承”。有非常众所周知的,经过长期研究的,实用的和非OOP的模式。发明使用“多态性”,“访客模式”等解析查询参数的新方法至少是愚蠢的。

数据访问也由现有的库执行,并且像“继承”或“多态”之类的奢侈品在那里没有使用。您仍然可以使用类,但这只是封装。您不能继承/重用MySQL代码来编写T-SQL或PL/SQL代码。您需要完全更换。哦,也许您的SELECT * FROM table可以被“继承”,并考虑各种可能性,哇。

现在我们剩下了什么?是的,业务逻辑。我们已经提到过,业务逻辑也是信息处理的短暂爆发。 PHP代码本身没有持久的业务状态。我们知道,由于Web的要求,几乎所有业务操作都必须花费不到一秒钟的时间。因此,您可以再次通过的状态比完整的应用程序少得多。在典型的Web应用程序中,大多数情况下,您会在上进行原子,孤立的业务操作。

现在让我们回到设计。我们知道我们的页面包含以下部分:

  • 输入
  • 业务逻辑
  • 数据访问
  • 输出

  • 我们已经在多态性和继承范围之外获得了输入,数据,输出。这是我们的最终照片:
  • 输入处理
  • 业务逻辑
  • 数据访问
  • 输出生产

  • 尽管业务逻辑可能是我们应用程序的最大组成部分,但它仍然必须存在于Web应用程序的一秒钟窗口中,因此必须是 small ,也就是短命的。

    是的,一台 super 计算机可以在一秒钟内完成很多工作,但我们仍在讨论大多数常见情况。有什么共同点? CRUD是常见的。这就是为什么Ruby on Rails和Active Record模式如此成功并且如此受欢迎的原因,因为它提高了生产率:CRUD。

    设计的复杂性与所涉及的数据元素和操作的数量成正比。并且由于我们假定大多数操作是CRUD,因此我们具有固定数量的操作和少量输入参数,因此的问题空间很小

    可能会有异常(exception),但是在大多数情况下,针对小问题空间的设计不可能同时既复杂又好。除非有大量的数据点和太多的冗余发生,否则您不太可能在网页的设计中使用继承。我重复一遍,在大多数情况下,这是粗略的CRUD。

    第二个,(是的,如果您忘记了,一开始会有第一个),Web应用程序的性能很重要(如果不是很关键的话),请记住“一秒钟”,在脚本环境中,它的重要性是两倍。

    面向对象的范例依赖于一种非常重要的低级机制来同时发挥作用和表现:指针间接。 CPU读取指针并跳转到它所指向的地址的能力与直接跳转到地址几乎没有区别。这样,我们可以有一个虚拟方法表用于查找,以进行正确的函数调用,并且编译器可以在不知道其确切类型的情况下调用对象的“some()”方法,因为它只是那里的指针中的任何内容,但它仍然像疯马。

    那个梦想结束于脚本世界。您没有本地执行指令的CPU。您有由PHP编译器生成的字节码,并由PHP解释程序解释。与CPU不同,PHP解释器必须处理更高级别的概念,例如抽象,类,类型,无论它是字节码。 CPU的简单指针间接寻址是PHP的一组复杂操作。解析操作,了解操作,可能进行一些完整性检查,最后使用另一组字节码执行该操作。

    因此,脚本世界中的继承开销比本地环境中慢了几个数量级。

    只要 yield 大于损失,这当然是可以接受的。考虑到性能损失可以通过其他方式(如升级,群集)来弥补,这似乎不是问题。确实是这样,这是我的最终声明:

    对于Web应用程序开发中的大多数场景,无需调用继承/多态性就可以实现同等可维护,同等可重用且可能具有更高性能的设计,因此,封装是PHP中最常见,最大的好处,而不是继承。

    关于php - 为什么要在php中使用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4872573/

    相关文章:

    php - 使用 codeigniter 将文本字段与行中的主键关联

    javascript - 如何上传照片但不同的文件夹?

    java - 如何实现具有多个可能重复的字符串属性的枚举类?

    UML用例图工作进度表

    swift - 在 Swift 中编写 Kotlin 的 by-clause(又名类委托(delegate))的正确方法是什么?

    php - 通过免费主机远程连接mysql

    php - 使用 laravel 和 jquery 分页无法按预期工作

    java - 泛型如何影响可能的参数/返回类型

    javascript - 类中类?

    software-design - 在洋葱、六边形或简洁架构中,域模型是否可以包含与数据库中的域模型不同的属性?