zoukankan      html  css  js  c++  java
  • php单例模式的研究

    几个关键点:

    1,对象P应该可以被系统中的任何对象使用

    2,对象P不应该被存储在会被覆写的全局变量总

    3,系统中不应该超过一个P对象,也就是说,Y对象可以设置P对象的一个属性,而Z对象不需要通过其他对象(假如Y和Z都可以访问P对象)就可以直接获得该属性的值

    实现:

    下面创建了一个无法从其自身外部来创建实例的类,听起来有些难,其实只要简单的定义一个私有的构造方法即可:

    <?php
    class P{
        private $props=array();
        private function __construct(){}
    
        public function setProperty($key,$val){
            $this->props[$key] = $val;
        }
        public function getProperty($key){
            return $this->props[$key];
        }
    }

    上面的类,由于构造方法被设置为私有,客户端代码无法实例化对象。因此setProperty和getProperty方法目前也是多余的。

    不过我们可以使用静态方法和静态熟悉来实例化对象:

    <?php
    class P{
        private $props=array();
        private static $instance;
    
        public static function getInstance(){
            if(empty(self::$instance)){
                self::$instance = new P();
            }
            return self::$instance;
        }
    
        private function __construct(){}
    
        public function setProperty($key,$val){
            $this->props[$key] = $val;
        }
        public function getProperty($key){
            return $this->props[$key];
        }
    }
    
    
    $pref = P::getInstance();
    $pref->setProperty("name","mattttttt");
    var_dump($pref);
    unset($pref);//移除引用
    $pref2 = P::getInstance();
    var_dump($pref2);
    $pref2->setProperty("name","masssssssssssss");
    var_dump($pref2);
    print $pref2->getProperty("name");//该属性值并没有丢失
    //输出   matttttttt
  • 相关阅读:
    vb做界面调用c编写的dll
    小记管线冲洗(现场学习)
    管网建模基础
    编写成绩信息管理系统
    MJRefresh超详细讲解
    iOS 在xib或者storyboard中添加AutoLayout后,在代码中修改AutoLayout约束条件
    tableViewCell重用导致图片错乱问题
    更新ruby
    控件基本动画
    Block动画和spring动画
  • 原文地址:https://www.cnblogs.com/jami918/p/3606093.html
Copyright © 2011-2022 走看看