zoukankan      html  css  js  c++  java
  • 50)PHP,单例模式

     1 class B{
     2     public $v1 = 10;
     3 
     4     private static $instance;
     5 
     6     private function __construct(){}
     7     public static function getNew(){
     8         //如果本类中的$instance还没有数据
     9         if( !isset(B::$instance) ){
    10             B::$instance = new self;
    11         }
    12         return B::$instance;
    13     }
    14     private function __clone(){}
    15 }
    16 //$o1 = new B();//出错,因为构造方法私有了,
    17 $o1 = B::getNew();
    18 $o1->v1 = 100;    //修改
    19 $o2 = B::getNew();
    20 var_dump($o1);
    21 echo "<br />";
    22 var_dump($o2);
    23 $o3 = clone $o1;    //克隆对象
    24 echo "<br />";
    25 var_dump($o3);
    26 $o1->v1 = 123;
    27 echo "<br />o1中的v1为:" . $o1->v1;
    28 echo "<br />o2中的v1为:" . $o2->v1;
    29 echo "<br />o3中的v1为:" . $o3->v1;

    然后结果截图:

     但是,有一个问题,虽然单例模式可以让类只是实例化一次,但是每一个类都有一个魔法函数clone,那么就可以创建的新的类,所以,我们要防止用clone创建新的类,就有了在我们的单例模式类里面给那个clone函数变成私有的,这样,我们在这类的外面就不能用clone函数了,代码如下:

     1 class B{
     2     public $v1 = 10;
     3 
     4     private static $instance;
     5 
     6     private function __construct(){}
     7     public static function getNew(){
     8         //如果本类中的$instance还没有数据
     9         if( !isset(B::$instance) ){
    10             B::$instance = new self;
    11         }
    12         return B::$instance;
    13     }
    14 //下面的这个private就是将clone变成私有的,在类的外面就不能用clone克隆了。
    15     private function __clone(){}
    16 }
  • 相关阅读:
    K8s(2)-部署应用
    Docker-常用命令(7)
    Docker-堆栈stack(6)
    Docker-集群swarm(5)
    Docker-服务(4)
    Docker的概念术语(2)
    k8s(1)-使用kubeadm安装Kubernetes
    Celery-分布式任务队列
    使用Python管理压缩包
    jQuery基础
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/7371465.html
Copyright © 2011-2022 走看看