Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.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 对于微博网站来说,singleton是一种好的设计模式吗?_Php_Mysql_Design Patterns_Singleton_Pdo - Fatal编程技术网

Php 对于微博网站来说,singleton是一种好的设计模式吗?

Php 对于微博网站来说,singleton是一种好的设计模式吗?,php,mysql,design-patterns,singleton,pdo,Php,Mysql,Design Patterns,Singleton,Pdo,我过去在项目中没有使用过任何OO,因为我使用了古老的mysql_查询调用和我自己的过滤,使它更简单,所以我想开始一个新项目,在这一过程中学习使用OO的设计模式 我想为kicks建立一个微博网站,发现这个类似乎很完整,要使用它,除了不能访问两个数据库之外,我看不出有什么问题,我不确定这个项目是否需要这两个数据库 比如说一个像这样的项目,或者一个简单的CMS软件,单身是个好主意吗?这些大人物会使用什么样的设计模式/数据库类类型来实现这些功能,如果要提高并发连接/性能,以后会不会限制太多 我后来也读过

我过去在项目中没有使用过任何OO,因为我使用了古老的mysql_查询调用和我自己的过滤,使它更简单,所以我想开始一个新项目,在这一过程中学习使用OO的设计模式

我想为kicks建立一个微博网站,发现这个类似乎很完整,要使用它,除了不能访问两个数据库之外,我看不出有什么问题,我不确定这个项目是否需要这两个数据库

比如说一个像这样的项目,或者一个简单的CMS软件,单身是个好主意吗?这些大人物会使用什么样的设计模式/数据库类类型来实现这些功能,如果要提高并发连接/性能,以后会不会限制太多


我后来也读过关于处理额外连接的工厂单例,因为更改其中的代码更简单。如果我没有弄错的话,singleton是一种新的设计模式,那么这会修复任何负面问题并使其成为更适合的设计模式吗。但是取决于可以使用的任务。

单例的目的是将对象实例限制为一个,并提供全局访问。 两者都是你不想要或不需要的东西

在PHP中,将实例限制为一个实例是毫无意义的,因为该限制仅适用于当前请求中的实例。如果两个请求同时到达你的微博站点,每个请求仍然会有一个实例。如果您想确保只有一个实例,只需不实例化第二个实例即可

全局访问也不是您想要的,因为它破坏了封装。如果您需要对象中的某个实例,请通过将其传入。这是干净和可维护的。它还有一个额外的好处,那就是允许您轻松地与其他实现交换依赖项,例如您的应用程序

甚至,一位独生子女模式的发明者如今也对这种模式提出了质疑:


你最好避免单身人士。

如前所述,单身人士对你的博客应用没有多大帮助。只需创建一个数据库实例并使用它

Sidenode,您在PHP中看到的通常是假的单例。如果实现为普通类,则通常需要使用::getInstance方法来实现单例解决方案。但是,该类的存在允许实例化多个项new Singleton&&new Singleton。因此,我推荐一种程序性单例,它没有这个问题,而且对眼睛也更好:

 function db() {
     static $db;
     if (!isset($db)) {
          $db = new PDO("sqlite:memory");
     }
     return $db;
 }

通过这种方式,您可以从blog中使用db->querySELECT*,并避免总是导入一个全局$db变量。

这是非常有争议的。它被过度使用,并附带了重要的警告,但它实现了一个独特的功能,我很难说它总是错的,它并不总是错的。当有一个以上的东西会导致事情爆炸,单身是一个很好的方式来防止灾难。但在大多数情况下,这是错误的,而且经常被滥用。它不应该被添加到常见问题的常见解决方案列表中,当你分解它时,它就是模式的本意。大多数人几乎不应该使用Singleton,如果没有GoF的支持,可能也不会使用。函数是在全局范围内定义的,因此在类中使用它与全局$db具有相同的耦合和封装问题;或者DB::getInstance;另外,由于db返回一个PDO对象,我可以简单地克隆它以获得多个实例。尝试var_dumpdb,clonedb;与PHP中的所有对象相同。OOP语义不允许真正的单例。不允许。您可以执行私有函数uu克隆{}和私有函数uu构造来防止多次实例化和克隆。预防没问题。不过,如果克隆可以返回$this,那么它将是一个更合适的单例。或者,如果有一种方法可以使new Singleton==new Singleton而不使用辅助方法和变通方法。