php单例变量赋值,聊聊PHP中的单例形式与静态变量_后端开发

本文深入探讨了PHP中的静态变量,指出其在函数和类中的作用及生命周期,强调它们在函数调用期间的持久性。同时,通过示例解释了单例模式的概念,展示了如何在PHP中实现单例,以及静态变量在这种模式下的角色。总结了静态变量在单例模式中的应用及其优缺点,并提出防止非法实例化对象的方法。
摘要由CSDN通过智能技术生成

db24e89326e3b680d5e9f014f2398ea9.png

在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中的单例形式与静态变量的细致内容,更多请关注ki4网别的相干文章!

收藏 | 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值