第七章:第16节 PHP面向对象——设计模式

更新于:2020-09-18 11:30:21

什么叫设计模式

所谓设计模式,就是一些解决问题的“常规做法”,是一种认为较好的经验总结。面对不同的问题,可能会有不同的解决办法,此时就可以称为不同的设计模式。


PHP的设计模式有两种,我们的手册里也就介绍了这两种:工厂模式和单例模式。

1.png


设计模式楠神认为很重要,因为实际项目中确切地用到了,起的作用也很关键。


PHP手册里就介绍了这两种设计模式,楠神这里有一份设计模式讲义(会在本节代码里),有好多种设计模式,但都是C++语言的。感觉PHP是弱语言编程语言,可能那些设计模式不太适合PHP,感兴趣地可下载看看。楠神认为设计模式这东西,只有在大量工作经验下才能会理解透。


工厂模式

在实际应用中,我们总是需要去实例化很多很多的类——以得到对象。


则:

我们可以设计出一个“工厂”(其实就是类),该工厂的作用(任务)就是为人们“生产”各种对象。这种工厂通常只要指定类名,就可以据此获取一个该类的对象。


上面的图片有手册里的工厂模式示例代码:


就是定义一个工厂类,里面有个静态方法,静态方法的参数是“类名”,执行这个静态方法就可以实例化一个类。


楠神认为这个示例代码不太好,只能实例化不需要传入其他参数的对象,如果实例化对象时需传入其他参数怎么办?看下面的代码:


1.png

还记得这几个函数吧:func_get_args、func_num_args、eval,第六章14节杂项函数里介绍了eval,缺少了eval还真就不好实现了。


1.png

1.png

第10行完全取代了第9行代码。


单例模式

应用中的某种需求:

对于某些类,在使用它的时候,从头到尾(程序运行的开始到结束),都只需要一个对象,就可以完成所有任务。


单例模式(Singleton)用于为一个类生成一个唯一的对象。像这种需求是非常常用的,关乎程序效率的一种应用需求。比如说从数据库获取数据,现在大多都用对象的方式从数据库读数据。如果我们的程序设计很复杂,一个功能需要运行很多文件,很多函数和方法。如果从数据库读取的数据在多个地方用到,不用单例模式的话,每重新实例化一次对象,就有可能会从数据库多一次读取重复的数据,严重影响了程序效率。


单例:

某个类,只允许其“创建”出一个对象,即使去进行多次创建,也只能得到一个对象。


1.png

1.png

上面的代码不能实现单例,看下面的代码:


1.png


我们来分析下代码:实现单例的条件——私有的静态变量、私有的空构造方法、公开的静态方法。


执行类的静态方法,判断静态变量有没有值,为null说明还没有实例化,实例化后赋值给静态变量,并返回静态变量。在类的内部可以用“new self”实例化一个对象。


执行类的静态方法,判断静态变量有值,不为null说明已实例化,直接返回静态变量。

1.png

看结果两个都是“object(B)#3”。


别忘了,除了new一下可获取新对象,还有clone也可以获取新对象,怎么防止clone呢?很简单在类里定义__clone方法,可以把它私有化。


private function __clone(){}


这两种设计模式挺重要的,尤其单例模式,它有助于提高性能的问题。实现单例模式的关键是静态变量,我们知道函数里也可以定义静态变量,所以用一个函数可以同时把两种模式都能实现了。


下面的函数是楠神实际项目中定义的一个函数,实现了工厂模式和单例模式。


1.png


PHP单例模式父类instance方法实现代码详解


扩展阅读:


PHP单例模式有什么意义?


cf210cd7912397dd16e453bf5482b2b7d1a28782.jpg


其他常用的设计模式《PHP的设计模式(一)之注册模式、适配器模式》、《PHP的设计模式(二)之策略模式、观察者模式》、《PHP的设计模式(三)之观察者模式(仿jQuery思路)php实现事件监听与触发的代码示例》、《PHP的设计模式(四)之原型模式、装饰器模式


本节学习代码》》》