本篇文章为大家展示了PHP中的单例模式与静态变量是什么,代码简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
在PHP中,没有普遍意义上的静态变量。与Java、c++不同,PHP中的静态变量的存活周期仅仅是每次PHP的会话周期,所以注定了不会有Java或c++那者种静态变量。
在PHP中,静态变量的存在意义仅仅是在某个结构体中(方法或者类)中传递一个变量,其作用域在此文件内。
功能测试(){ 静态$ var=1; echo $ var + + # 39;公司& # 39;; } 测试(); 测试(); 测试();//输出//1//2//3
在函数测试的三次调用中,变量$ var在三次调用中都是存在的,并且每次会递增1,而并没有清空或者重置
所以可以得出一个结论,静态变量在当前结构体所在的生命周期中一直存在。当前的例子中,测试函数的生命周期就是当PHP脚前本,只要程序没释放都是有效的。
而在类中,代码大概是这样子的
类 { 私有静态美元=1; 私人$ b=2; 公共函数添加() { 回声self:: $ + + # 39;公司& # 39;; echo $ this→b + + # 39;公司& # 39;; } } 美元class1=new (); 美元class1→添加(); 美元class1→添加(); 美元class2=new (); 美元class2→添加(); 美元class2→添加();//输出//1//2//2//3//3//2//4//3
从上面的类的运行结果来看,也得到了在函数中相同的结果
那么大概总结一下就是
<强> PHP的静态变量在所在对应的结构体的生命周期中永久存在,并且值保持一致,不论这个结构体被调用或者实例化了多少次。强>
其实这就是动态变量和静态变量的区别,具体看此篇文章。动态变量只在类中有效,而静态变量在当PHP脚前本。
再反过来看单例模式
A类 { 私有静态实例美元=零; 私人$ b=1; 公共静态get_instance()函数 { 如果实例(self:: $==null) { $ classname=__CLASS__进行; 自我::$实例=新$ classname (); } 返回self:: $实例; } 公共函数添加() { 美元这→b + +; } 公共函数显示() { echo $ this→b; } } $=a:: get_instance (); b=美元:get_instance ();//此处一个和b美元变量完全相同! 美元→添加(); 美元→显示(); 回声& # 39;& # 39;; b→美元显示();//输出//2//2
此时,由于单例模式存在,使得一个和b美元完全是同一个对象,所以之间如果需要共享数据,完全不需要静态变量(废话,就是自己。因为在任何时候,应用程序中都只会有这个类仅有的一个实例存在!无论你调用多少次单例,里面的数据是不会被重新实例化的)。
所以,在单例模式中,静态变量根本就没有存在的意义。当然,如果你没事干,非要使用新的方法来初始化对象的话,也行,此时单例模式被打破,回归到无单例模式的状态。
如果为了防止使用新的来实例化对象,那么可以考虑对类的__construct函数设置为私人属性
类 { 私有静态实例美元=零; 私人$ b=1; 私人__construct()函数 {//这个函数的代码//不能离开这个班 } 公共静态get_instance()函数 { 如果实例(self:: $==null) { $ classname=__CLASS__进行; 自我::$实例=新$ classname (); } 返回self:: $实例; } 公共函数添加() { 美元这→b + +; } 公共函数显示() { echo $ this→b; } } $=a:: get_instance (); b=美元:get_instance ();//此处一个和b美元变量完全相同! 美元→添加(); 美元→显示(); 回声& # 39; & # 39;; b→美元显示();//输出//2//2//如果尝试用新的来实例化的话 $ c=new ();//输出//致命错误:调用私有::__construct()从无效的上下文//如果需要一个类的实例化对象,只能通过开放的get_instance静态方法进行初始化
优点:单例模式可以避免大量的新操作,因为每一次新操作都会消耗内存资源和系统资源
缺点:在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的