所谓设计模式,就是一些解决问题的“常规做法”,是一种认为较好的经验总结。面对不同的问题,可能会有不同的解决办法,此时就可以称为不同的设计模式。
PHP的设计模式有两种,我们的手册里也就介绍了这两种:工厂模式和单例模式。
设计模式楠神认为很重要,因为实际项目中确切地用到了,起的作用也很关键。
PHP手册里就介绍了这两种设计模式,楠神这里有一份设计模式讲义(会在本节代码里),有好多种设计模式,但都是C++语言的。感觉PHP是弱语言编程语言,可能那些设计模式不太适合PHP,感兴趣地可下载看看。楠神认为设计模式这东西,只有在大量工作经验下才能会理解透。
在实际应用中,我们总是需要去实例化很多很多的类——以得到对象。
则:
我们可以设计出一个“工厂”(其实就是类),该工厂的作用(任务)就是为人们“生产”各种对象。这种工厂通常只要指定类名,就可以据此获取一个该类的对象。
上面的图片有手册里的工厂模式示例代码:
就是定义一个工厂类,里面有个静态方法,静态方法的参数是“类名”,执行这个静态方法就可以实例化一个类。
楠神认为这个示例代码不太好,只能实例化不需要传入其他参数的对象,如果实例化对象时需传入其他参数怎么办?看下面的代码:
还记得这几个函数吧:func_get_args、func_num_args、eval,第六章14节杂项函数里介绍了eval,缺少了eval还真就不好实现了。
第10行完全取代了第9行代码。
应用中的某种需求:
对于某些类,在使用它的时候,从头到尾(程序运行的开始到结束),都只需要一个对象,就可以完成所有任务。
单例模式(Singleton)用于为一个类生成一个唯一的对象。像这种需求是非常常用的,关乎程序效率的一种应用需求。比如说从数据库获取数据,现在大多都用对象的方式从数据库读数据。如果我们的程序设计很复杂,一个功能需要运行很多文件,很多函数和方法。如果从数据库读取的数据在多个地方用到,不用单例模式的话,每重新实例化一次对象,就有可能会从数据库多一次读取重复的数据,严重影响了程序效率。
单例:
某个类,只允许其“创建”出一个对象,即使去进行多次创建,也只能得到一个对象。
上面的代码不能实现单例,看下面的代码:
我们来分析下代码:实现单例的条件——私有的静态变量、私有的空构造方法、公开的静态方法。
执行类的静态方法,判断静态变量有没有值,为null说明还没有实例化,实例化后赋值给静态变量,并返回静态变量。在类的内部可以用“new self”实例化一个对象。
执行类的静态方法,判断静态变量有值,不为null说明已实例化,直接返回静态变量。
看结果两个都是“object(B)#3”。
别忘了,除了new一下可获取新对象,还有clone也可以获取新对象,怎么防止clone呢?很简单在类里定义__clone方法,可以把它私有化。
private function __clone(){}
这两种设计模式挺重要的,尤其单例模式,它有助于提高性能的问题。实现单例模式的关键是静态变量,我们知道函数里也可以定义静态变量,所以用一个函数可以同时把两种模式都能实现了。
下面的函数是楠神实际项目中定义的一个函数,实现了工厂模式和单例模式。
扩展阅读:
PHP单例模式有什么意义?
其他常用的设计模式《PHP的设计模式(一)之注册模式、适配器模式》、《PHP的设计模式(二)之策略模式、观察者模式》、《PHP的设计模式(三)之观察者模式(仿jQuery思路)php实现事件监听与触发的代码示例》、《PHP的设计模式(四)之原型模式、装饰器模式》