企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
什么是单例模式呢?首先要理解PHP中面向对象的内存知识! 如下代码,创建一个类A,然后实例化两个对象a和b,那么在内存中就会有a、b两个对象,这两个对象之间除了公共类A的方法和属性,其他方面没有任何的关系,所以最后输出的uname的值都是不一样的! class A{ public $uname; } $a = new A(); $a->uname = 100; echo $a->uname.'<br/>';//100 $b = new A(); $b->uname = 200; echo $b->uname;//200 利用static关键词,创建一个静态的方法,然后通过类本身去创建对象,那么最后不管定义多少个变量,这几个变量所指向的对象都是同一个对象,也就是同一个内容地址,这样可以节省内存空间。 如下代码:因为使用了static关键词定义了属性obj,所以它只会初始化一次,getObj方法里边的if判断语句也只会执行一次,最后return出的对象都是同一个对象! class A{ public $uname; static $obj = null; public function __construct(){ echo '100'.'<br/>'; } public function show(){ echo $this->uname; } static function getObj(){ if(is_null(self::$obj)){ self::$obj = new A(); } return self::$obj; } } $a = A::getObj(); $a->uname = 200; echo $a->uname.'<br/>';//200 $b = A::getObj(); echo $b->uname.'<br/>';//200 $b->uname = 300; echo $b->uname.'<br/>';//300 echo $a->uname.'<br/>';//300 需要注意的是:如果对象是通过new关键字创建的,那么类里边的默认函数__construct就必须得是public状态,否则创建对象的同时执行马上会执行这个构造函数,但是定义成private私有的,那就不允许访问,导致出错! class A{ private function __construct(){ echo 123; } } $a = new A();//报错