聊聊PHP中的单例模式与静态变量

聊聊PHP中的单例模式与静态变量

在PHP中,没有普遍意义上的静态变量。与Java、C++不同,PHP中的静态变量的存活周期仅仅是每次PHP的会话周期,所以注定了不会有Java或者C++那种静态变量。

静态变量在PHP中

在PHP中,静态变量的存在意义仅仅是在某个结构体中(方法或者类)中传递一个变量,其作用域在此文件内。

function test(){
    static $var = 1; 
    echo $var++.'';
}
test();
test();
test();
//OutPut
//1
//2
//3

在函数test的三次调用中,变量$var在三次调用中都是存在的,并且每次会递增1,而并没有清空或者重置
所以可以得出一个结论,静态变量在当前结构体所在的生命周期中一直存在。当前的例子中,test函数的生命周期就是当前PHP脚本,只要程序没释放都是有效的。

静态变量在类中

而在类中,代码大概是这样子的

class A
{
    private static $a = 1; 
    private $b = 2;
    public function add()
    {
        echo self::$a++.'';
        echo $this->b++.'';
    }
}
$class1 = new A();
$class1->add();
$class1->add();
$class2 = new A();
$class2->add();
$class2->add();
//Output
//1
//2
//2
//3
//3
//2
//4
//3

从上面的类的运行结果来看,也得到了在函数中相同的结果

那么大概总结一下就是

PHP的静态变量在所在对应的结构体的生命周期中永久存在,并且值保持一致,不论这个结构体被调用或者实例化了多少次。

其实这就是动态变量和静态变量的区别,具体看此篇文章。动态变量只在类中有效,而静态变量在当前php脚本。

静态变量在单例模式

再反过来看单例模式

class A
{
    private static $instance = null;
    private $b = 1;
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname(); 
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b变量完全相同!
$a->add();
$a->show();
echo '';
$b->show();
//output
//2
//2

此时,由于单例模式存在,使得$a和$b完全是同一个对象,所以之间如果需要共享数据,完全不需要静态变量(废话,就是自己。因为在任何时候,应用程序中都只会有这个类仅有的一个实例存在!无论你调用多少次单例,里面的数据是不会被重新实例化的。)

所以,在单例模式中,静态变量根本就没有存在的意义。当然,如果你没事干,非要使用new方法来初始化对象的话,也行,此时单例模式被打破,回归到无单例模式的状态。

如果为了防止使用new来实例化对象,那么可以考虑对类的__construct函数设置为private属性

class A
{
    private static $instance = null;
    private $b = 1;
    private function __construct()
    {
    //Code in this function
    //could not be get out of the class
    }
    public static function get_instance()
    {
        if(self::$instance == null){
            $classname = __CLASS__;
            self::$instance = new $classname();
        }
        return self::$instance;
    }
    public function add()
    {
        $this->b++;
    }
    public function show()
    {
        echo $this->b;
    }
}
$a = A::get_instance();
$b = A::get_instance();
//此处$a和$b 变量完全相同!
$a->add();
$a->show();
echo '
';
$b->show();
//output
//2
//2
  
//如果尝试用new来实例化的话
$c = new A();
//output
//Fatal error: Call to private A::__construct() from invalid context in
//如果需要A类的实例化对象,只能通过开放的get_instance静态方法进行初始化

优点:单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源

缺点:在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的

关于聊聊PHP中的单例模式与静态变量的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/40349.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
php学习php学习订阅用户
上一篇 2022年6月11日 23:58
下一篇 2022年6月11日 23:58

相关推荐

  • PHP实现邮件推送功能的技巧。

    随着互联网的不断发展,电子邮件已经成为了人们生活和工作不可或缺的一部分。许多网站和应用程序都需要发送邮件来与用户进行交互或发送重要的信息。在使用PHP编写网站和应用程序时,邮件推送功能是非常重要的一部分…

    2023年5月28日
    01
  • 如何使用PHP实现商城的预售功能。

    随着电子商务行业的发展,预售功能逐渐成为电商平台赢得消费者青睐的必备选项之一。预售是指商家在正式售卖商品前提供一定数量的商品预订服务,即顾客可以提前下单预定未来上市的商品。在预售阶段,商家可以通过各…

    2023年5月23日
    01
  • PHP文件上传入门案例

    为了方便管理这些上传的文件,我们通常会将上传的文件保存到uploads目录下面 防止上传文件过大 思路:首先给定一个文件的最大限制,然后再拿上传的文件的大小 和 最大的限制进行比较,文件大小单位是字节,字节之间…

    2018年9月15日 PHP案例操作
    0258
  • 经验分享php网页搭建,Php网页添加文字。

    在当今的互联网时代,PHP是一种广泛使用的服务器端脚本语言,用于创建动态网页和Web应用程序,它易于学习和使用,并且具有丰富的功能和灵活性,本文将介绍如何使用PHP搭建网页并添加文字。 我们需要安装一个Web服务…

    2024年6月28日
    00
  • php如何使用PHP的POSIX扩展。

    PHP的POSIX扩展是一组允许PHP与POSIX兼容操作系统进行交互的函数和常量。POSIX(Portable Operating System Interface)是一组操作系统接口标准,旨在允许软件开发人员编写可在各种UNIX或UNIX类操作系统上运行的应…

    2023年6月3日
    05
  • 如何使用PHP实现微信小程序中的滑块功能。

    随着微信小程序的普及,其功能也越来越多样化。其中,滑块功能作为一个非常常用的组件,具有在界面上进行滑动选择、筛选等操作的作用,其在微信小程序中也不例外。本文将介绍如何使用PHP来实现微信小程序中的滑块功…

    2023年6月3日
    08
  • PHP中的物联网技术。

    随着物联网技术的普及和发展,越来越多的企业开始关注物联网技术的应用和研究。而PHP作为一种广泛应用于Web开发的语言,也可以很好地支持物联网技术的开发。本文将介绍PHP中的物联网技术,包括物联网技术的概念、PH…

    2023年5月30日
    03
  • PHP中的微服务架构。

    随着互联网的发展和技术的进步,传统的架构模式面临着更多的挑战和需求。其中,微服务架构作为一种新的设计思路,在现代化互联网架构中占据了越来越重要的地位。微服务架构是一种以轻量级、模块化单元为基础的服务…

    2023年5月30日
    04

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息