百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 聊聊PHP中的单例模式与静态变量
分享文章到:

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

发布时间:09/01 来源:未知 浏览: 关键词:

在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教程》

以上就是聊聊PHP中的单例模式与静态变量的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有154人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板