1

我在 classes/database.php 中有单例数据库类,如php 中的单例模式中所述,我正在使用 Database::getInstance() 方法在 users.php 中创建数据库对象,然后我在 accounts.php 中调用相同的静态方法(Database::getInstance()),这里我得到的是新实例,而不是我在 users.php 中创建的实例。我是设计模式的新手,有点困惑。

我的问题是

  1. 我们是否需要持久化对象才能在 php 中实现单例模式?
  2. 如果不是,那么我们在整个应用程序中保留单个实例的所有方法是什么。
4

1 回答 1

0

桌面应用程序通常使用持久的单个数据库连接。但是,在 PHP 和大多数其他 Web 语言/框架中,情况并非如此。您对每个页面加载使用一个短期连接,而不是单个长期连接。与其将您的应用程序视为一个整体,不如考虑每个页面加载的过程。在 PHP 中,除非您将数据保存在数据库或 $_SESSION 或其他地方,否则其他页面加载不会知道另一个页面。

PHP 中的单例模式是整个页面加载过程中的单例模式之一。虽然最初它可能看起来像“有什么意义?它只是一个页面加载”,但当您使用更大的应用程序时,很明显每个页面加载都不是一个无关紧要的操作。在像 Drupal 这样的系统中,每次页面加载都可以有 10 到 100 个数据库查询

哦,单例模式被认为是不好的做法,稍后会咬你。事实上,在您的所有应用程序中都应该避免使用它。更好的模式应该是 DAO 模式或工厂模式。请保存自己,不要使用单例(我犯了很多次这个错误)。

至于在页面加载之间持久化对象(这对几乎所有应用程序来说都是非常必要的),这就是您的数据库和 $_SESSION 变量的用途。您还可以使用其他缓存选项,例如 APC ( http://php.net/manual/en/book.apc.php)。您的应用程序应该能够根据在数据库中找到的任何内容重新构建它需要的内容。例如,创建了一个用户。您将该用户的数据持久保存到数据库中。每当有人出现并想了解用户时,它会将其从数据库中拉出以重新创建您的用户对象。另一个例子是用户登录。您希望他们保持登录状态,因此您将某种变量持久保存到 $_SESSION,该变量在每次页面加载时检查以查看他们是否已登录以及他们以谁登录。您进行一些检查,然后加载他们说他们从您的数据库登录的用户。

于 2013-02-28T15:17:02.750 回答