ホームページ >バックエンド開発 >PHPチュートリアル >PHP单例模式应用场景有哪些?

PHP单例模式应用场景有哪些?

WBOY
WBOYオリジナル
2016-06-06 20:38:491106ブラウズ

网上看到一些达人写购物车用“单例模式”,不知道是怎么考虑的,按照java下的单例模式理解,岂不是整个应用程序都只有一个购物车类了?这样购物车数据不就在一起混着了吗?同时,PHP是脚本语言,单例模式有意义吗?页面执行完,不是所有的东西都被回收?请对PHP单例模式机制有深入了解的大神在这里谈谈自己的看法,谢谢!
PS.比如这个达人写的购物车:http://www.thinkphp.cn/topic/5205.html

回复内容:

网上看到一些达人写购物车用“单例模式”,不知道是怎么考虑的,按照java下的单例模式理解,岂不是整个应用程序都只有一个购物车类了?这样购物车数据不就在一起混着了吗?同时,PHP是脚本语言,单例模式有意义吗?页面执行完,不是所有的东西都被回收?请对PHP单例模式机制有深入了解的大神在这里谈谈自己的看法,谢谢!
PS.比如这个达人写的购物车:http://www.thinkphp.cn/topic/5205.html

有意义呀,比如你有个数据库对象 DB,非单例的做法就是每次用时

<code>$db = new DB();
....
$db->query("....");
</code>

用单例,你只需要在工厂方法里判断是否已经初始化过了对象,有就返回,第一次就初始化,程序退出时断开(__destruct),用起来就简单了。

<code>$db = DB::getInstance();
$db->query("....");
// 或
$db = DB::getInstance("db2");
$db->insert("xxx", $data);
</code>

甚至直接封装成常用函数

<code>DB::query("....");
</code>

这样如果你的程序里有很多位于不同层级的地方要使用 DB 对象,只管找 DB 类要就是了,第一次的时候连接,之后都不会重复连接数据库。

单例的应用面很广,可以用在 Cache, Log 等各种资源需要被频繁调用的地方。


哦,你是在拿 Java 的比较呀。单例并非你想的那样必须整个程序(姑且理解为进程吧)一个实例,要看编写的人怎么做的和他的意图。在 Servlet 里有 Request, Application, Session 几个不同的作用域,当然也可以利用 LocalThread 等在线程内共享,我猜想你同事的购物车应该是 Session 或 Application 下的吧,只会对当前会话或应用有效。

PHP是脚本语言,单例模式有意义吗?页面执行完,不是所有的东西都被回收?
你这里说的并没有错,但是说php单例模式没有意义就要打问号了,我php框架紧紧熟悉CI,CI也不例外的采用单利模式

<code>public static function &get_instance()
{
    return self::$instance;
}
</code>

那么他为什么要这么做呢?我举一个简单的例子,ci允许用户使用第三方类库,或者你自己写的帮助类等等。你在使用这些类库的时候,如果你想在这些类库中持有对CI的引用的话,很见得的一个方法,直接在某个功能模块中get_instance,就得到了你本次执行的CI实例了,试想一下,CI示例的上下文环境也被随之带过来了,那么就可以使用你的类库来对CI实例中的一些数据进行一些处理了。

我这里这么说,兴许还是有些牵强,也许会有人说CI那里压根就不是单例模式,构造方法都不是私有的,那我只能说你对单例理解有点狭隘了。

在一个php框架的核心,绝对是不需要你加载两个的,一次执行中,一个就够了。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。