5

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

4

5 回答 5

14

封装:类是一个有用的包,包含代码和相关数据,与其他所有内容隔离。这样可以更轻松地移动它,而无需搜索确切的变量,也不会与现有代码/数据发生冲突。

当然,类还有其他用途,但在 PHP 等脚本环境中,我认为最大的优势在于。

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

第一的,网页的生命周期是一个请求/响应对,理想情况下少于一秒。状态通常保存在外部实体(会话、cookie、数据库等)中。由于页面的生命周期非常短,因此网页代码中的可能状态少于胖客户端。几乎总是少量的代码连续运行和完成工作。可以说,就设计参数的简单性和数量而言,网页与控制台应用程序相当。尽管表单中输入参数的数量可以达到千兆字节,但 UI 元素和输入参数之间的关系仅限于屏幕分辨率,即用户一次可以填写的整体能力。因此,在大多数情况下,我们的输入参数数量较少,这意味着状态数量较少。当然在组合和“

Web 应用程序中的输入和输出基本相同:输入是查询参数或表单数据,输出是 HTML 文档。因此,在其短暂的生命周期中,输入处理和输出生成代码的形状和设计与网页类似。我知道我在图片中省略了一大块“业务逻辑”,我会谈到这一点。但是,让我们确保我们没有在代码的这些部分中使用 OOP 的漂亮特性,例如“多态性”和“继承”。有很多众所周知的、长期研究的、实用的和非 OOP 模式。发明使用“多态性”、“访问者模式”等解析查询参数的新方法至少是愚蠢的。

数据访问也由现有的库执行,像“继承”或“多态”这样的奢侈品在那里没有用处。您仍然可以使用类,但这只是封装。您不能继承/重用 MySQL 代码来编写 T-SQL 或 PL/SQL 代码。你需要一个完整的替换。哦,也许你SELECT * FROM table可以“继承”,想想可能性,哇。

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

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

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

我们已经得到了超出多态性和继承范围的输入、数据、输出。这是我们的最终图片:

  • 输入处理
  • 商业逻辑
    • 数据访问
  • 产出生产

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

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

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

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

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

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

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

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

这当然是可以接受的,只要收益大于损失。考虑到性能损失可以通过升级、集群等其他方式恢复,这似乎不是问题。这当然是真的,这是我的最后陈述:

对于 Web 应用程序开发中的大多数场景,可以在不调用继承/多态的情况下实现同样可维护、同样可重用和可能更高性能的设计,因此封装是 PHP 中最常见和最大的好处,而不是继承。

于 2011-02-02T09:21:40.417 回答
4

使用类或 OOP(面向对象编程)的原因有很多。

  1. 代码重用
  2. 遗产
  3. 更易于维护
  4. 封装

还有很多原因,你应该看看使用 OOP 的优点/缺点。

于 2011-02-02T09:22:13.010 回答
2

我的时间

$db->query()
mysql_query() 

几乎一样。

我们不使用类来更快地执行代码,而是组织它们。

随着您的项目越来越大,您将难以管理代码。

如果您有对象,那么您可以实例化该对象并再次使用它们,而且您的代码与其他人混淆的机会更少。

面向对象的编码方式是优雅地管理代码并因此产生更好结果的最简单和最佳实践。

于 2011-02-02T09:23:17.067 回答
2

当我们使用时,您必须先使用和mysql_query()连接到数据库。mysql_connect()mysql_select_db()

每次你都mysql_connect()付出代价。
所以你会做一次mysql_connect()并保存$link. 并将此链接用于每个mysql_query("...", $link)

在对象中它是相同的,但它更优雅,您只需创建类的一个实例(因此它创建到数据库的连接)并使用具有链接的对象。

如果您更改数据库密码,您将更改一次,就在课堂上。
如果您将 MySQL 更改为 PostgreSQL,您将重写一次代码,就在课堂上。它不会影响您应用程序的其余部分。

于 2011-02-02T09:41:02.703 回答
0

正如@frbry 所说,我们使用类进行抽象。需要抽象来管理和降低复杂性。当您能够“抽象”操作和数据时,您就可以专注于其他事情,而不是在做其他事情时考虑“孤立和抽象”的事情的实现。

它还有助于将来更改系统,对代码的其他部分的影响较小,并再次降低系统的复杂性。

1986 年有一个非常好的 MIT 讲座,一般是关于 LISP 编程的,但是它也很好地描述了为什么你需要在过程(或他们称之为黑盒子)中抽象事物 - 他们提出的观点是软件开发就是一切关于降低复杂性。

这是链接:http ://www.youtube.com/watch?v=2Op3QLzMgSY

于 2011-02-02T09:26:17.830 回答