首页 > 其他 > 详细

单例设计模式

时间:2019-06-01 00:30:25      阅读:109      评论:0      收藏:0      [点我收藏+]
必须先声明一个静态私有属性:用来保存当前类的实例
* 1. 为什么必须是静态的?因为静态成员属于类,并被类的所有实例所共享
* 2. 为什么必须是私有的?不允许外部直接访问,仅允许通过类方法控制方法
* 3. 为什么要有初始值null,因为类内部访问接口需要检测实例的状态,判断是否需要实例化
技术分享图片
 //单例
 class Uni{
         //创建静态私有的变量保存该类对象
     static private $instance;
         //参数
     private $config;
         //防止直接创建对象
     private function __construct($config){
         $this -> config = $config;
                 echo "我被实例化了";
     }
         //防止克隆对象
     private function __clone(){
 
     }
     static public function getInstance($config){
                 //判断$instance是否是Uni的对象
                 //没有则创建
         if (!self::$instance instanceof self) {
             self::$instance = new self($config);
         }
        return self::$instance;
         
     }
    public function getName(){
        echo $this -> config;
    }
}
$db1 = Uni::getInstance(1);
$db1 -> getName();
echo "<br>";
$db2 = Uni::getInstance(4);
$db2 -> getName();
View Code

构造函数设置为私有属性的时候,只会触发一次?!构造函数是在类实例化的时候触发。构造方法不能声明为static 。静态方法不能调用非静态的方法。  非静态方法是可以调用静态方法的。

原因:静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存。非静态方法是属于对象的,对象是在类加载之后创建的。也就是说静态方法先于对象存在,当你创建一个对象时,程序为其分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。

但是非静态方法也有办法调用静态方法:  (new self())->func();    类似这种。

技术分享图片
class Test {
    public function func () {     
        return hello ;
    }  
    public static function action () {
        // 如何调用 func 方法 ?
        return (new self())->func();
    }
    
}
View Code
一、什么是单例模式
作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
https://www.cnblogs.com/sgm4231/p/9851725.html

单例设计模式

原文:https://www.cnblogs.com/bneglect/p/10958094.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!