LOADING

php设计模式之单例模式

在同事交流中使用设计模式描述程序思想,效率要快的多.
初学者可以把设计模式理解成一种专业术语, 就是为了沟通开发交流无障碍的,
所以设计模式是必学的
github 代码地址: https://github.com/baisecaihong/GOF
单例模式:
生成原因:1全局变量是无法复用的,如果A程序的全局变量没有增加到B程序中,那么你就无法在B中执行代码

          2全局变量将类捆绑与特定的环境,破坏了封装 

作用:用单例模式改进全局变量,因为无法用错误类型的数据覆写一个单例

<?php
//单例模式
class danli{

private $value = array();

private static $instance;

public static function getInstance()
{
    if(!(self::$instance)){
        self::$instance = new danli();
    }
    return self::$instance;
}

private function __construct()
{

}

public function __clone()
{
    // TODO: Implement __clone() method.
}

public function __wakeup()
{
    // TODO: Implement __wakeup() method.
}

public function setValue($key,$val){
    $this->value[$key] = $val;
}

public function getValue($key){
    return $this->value[$key];
}

}

$danli = danli::getInstance();
$danli->setValue('name','白色彩虹');
unset($danli);
var_dump($danli);
$danli2 = danli::getInstance();
print $danli2->getValue('name');

解释下代码
创建danli类
声明私有化变量$value数据类型为array,这一步就阻止了设置value为其他类型的覆写
声明私有化静态变量$instance 静态变量只存在于函数作用域内,静态变量只存活在栈中,下次再调用这个函数的时候,该变量的值会保留下来 而且私有化只能类内部访问
声明公共静态方法getInstance
如果$instance为空就重新实例化自己创建一个danli类实例并且返回实例
私有化初始化方法
私有化克隆
私有化wakeup
这些是用来保持数据一致性,防止被克隆之后操作混乱
共有的设置value 和提取value

使用:$danli引用danli类中的getInstance;
设置value值
删除引用
这个时候打印下$danli返回Undefined variable: danli
说明已经删除了,但是之前设置的value的值还在
所以$danli2再引用一次,
打印值 可以打印出来
$instance是不能被类外部访问的只能通过getInstance进行访问,又因为getInstance方法是public且static的所以脚本的任何地方都可以调用 这就形成了单例模式,

标签: none

添加新评论