老生常谈PHP面向对象之注册表模式

注册表模式可似把他想像成一个全局变量,所有的模块都从这个全局变量里存取数据,或者也可以想象成某个酒吧的许愿墙或留言版,上面的内容大家都可以看到,也可以改写。这里主要按作用域介绍三种类别的注册表类(请求级别、会话级别、应用程序级别)。

namespace woo\base;

//基类
abstract class Registry {
  abstract protected function get($key);
  abstract protected function set($key,$val);
}

//请求级别,他的生存周期通常为从用户发起一个请求到后台程序回复这个请求为止
class RequestRegistry extends Registry{
  private $values = array();
  private static $instance;

  private function __construct (){}

  static function instance(){    // 单例,即这个类只有一个唯一的实例
    if(!isset(self::$instance)){
      self::$instance = new self();
    }
    return self::$instance;
  }

  protected function get($key){
    if(isset($this->values[$key]){
      return $this->values[$key];
    }
    return null;
  }

  protected function set($key,$val){
    $this->values[$key] = $val;
  }

  static function getRequest(){
    return self::instance()->get('request');
  }

  static function setRequest(\woo\controller\Request $request){      //\woo\controller\Request 主要功能是处理用户请求信息的一个类
    return self::instance()->set('request',$request);
  }
}

//会话级别,此示例中类的生存周期主要还是看SESSION的生存时间
class SessionRegistry extends Registry{
  private static $instance;
  private function __construct (){
    session_start();
  }

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

  protected function get($key){
    if(isset($_SESSION[__CLASS__][$key])){
      return $_SESSION[__CLASS__][$key];
    }
    return null;
  }

  protected function set($key,$val){
    $_SESSION[__CLASS__][$key] = $val;
  }

  function setComplex(Complex $complex){
    self::instance()->set('complex',$complex);
  }

  function getComplex(){
    return self::instance()->get('complex');
  }
}

//应用程序级别,此示例中因相关的值是保存在文本文件中,所以只要文件存在,保存的值也就一直存在
 class ApplicationRegistry extends Registry{
  private Static $instance;
  private $freezedir = 'data';
  private $values = array();
  private $mtimes = array();

  private function __construct (){}

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

  protected function get($key){
    $path = $this->freezedir . DIRECTORY_SEPARATOR . $key; // 保存值的文件的路径
    if(file_exists($path)){
      clearstatcache();     // 清除filemtime缓存的上次记录的文件修改时间
      $mtime = filemtime($path);
      if(!isset($this->mtimes[$key])){
        $this->mtimes[$key] = 0;
      }
      if($mtime > $this->mtimes[$key]){    // 文件内容假如被修改过,那么就要重新获取里面的值
        $data = file_get_contents($path);
        $this->mtimes[$key] = $mtime;
        return ($this->values[$key] = unserialize($data));
      }
    }
    if(isset($this->values[$key])){
      return $this->values[$key];
    }
    return null;
  }

  protected function set ($key,$val){
    $this->values[$key] = $val;
    $path = $this->freezedir . DIRECTORY_SEPARATOR . $key;
    file_put_contents($path,serialize($val));
    $this->mtimes[$key] = time();
  }

  static function getDSN(){
    return self::instance()->get('dsn');
  }

  static function setDSN($dsn){
    return self::instance()->set('dsn',$dsn);
  }

 }

以上这篇老生常谈PHP面向对象之注册表模式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2017-05-25

PHP 面向对象详解

对象的主要三个特性 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型. 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同. 面向对象模型 面向对象的概念: oop(面向对象的编程)它能是其代码更加简洁易于维护并且具有更强的可重性 什么是类: 类是具有相同属性和服务的一组对象的集合比如说人,书,轮船,车都属于类,他为属于该类的对象做了一个统一的抽象描述,在编程的语言中类是一个单独的程序,它应该有一个类

PHP面向对象之事务脚本模式(详解)

如下所示: /* 事务脚本模式: 类似于thinkphp中的model层,或者说就是操作数据库的类. 个人觉得实践中使用起来还是挺简单方便的,就是SQL语句写死了的话,灵活性就不够. 示例代码如下: */ namespace woo\process; abstract class Base{ static $DB; //pdo对象 static $stmts = array(); //sql语句句柄 function __construct (){ $dsn = \woo\base\Applic

深入php面向对象、模式与实践

1 语法 1.1 基础语法 clone 需要操作原对象,但又不想影响原对象. 复制代码 代码如下: $K_back = clone $K; 基本数据类型和数组都为真复制,即为真副本,当属性为对象时,为假复制,改变副本仍会影响原对象.解决方案: //在原对象中添加 function __clone(){ $this->对象 = clone $this->对象 } __clone在clone前自动触发,可以执行一些在备份前的属性操作. 2.&传递引用 方法引用传递,改变源对象 复制代码 代

Python 使用 attrs 和 cattrs 实现面向对象编程的实践

Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了或者某一对象非常复杂了,其中的一些写法会相当相当繁琐,而且我们会经常碰到对象和 JSON 序列化及反序列化的问题,原生的 Python 转起来还是很费劲的. 可能这么说大家会觉得有点抽象,那么这里举几个例子来感受一下. 首先让我们定义一个对象吧,比如颜色.我们常用 RGB 三个原色来表示颜色,R.G.B 分别代表红.绿.蓝三个颜色的数值,范围是 0-255,也就是每个原色有 25

JS工厂模式开发实践案例分析

本文实例讲述了JS工厂模式开发.分享给大家供大家参考,具体如下: 基于JS工厂模式的H5应用,实现了轮播图功能与滑屏功能,并且实现了文字大小的自适应功能,基于SASS样式开发. 核心的JS代码如下: index.js define(function(){ var self = null, start = null, move = null, end = null, handle = null, timer = null, left = 0, x = 0, startX = 0, baseWidt

PHP对象、模式与实践之高级特性分析

本文实例讲述了PHP面向对象程序设计高级特性.分享给大家供大家参考,具体如下: 高级特性 包括: 1.静态方法和属性(通过类而不是对象来访问数据和功能) 2.抽象类和接口(设计,实现分离) 3.错误处理(异常) 4.Final类和方法(限制继承) 5.拦截器(自动委托) 6.析构方法(对象销毁前的清理工作) 7.克隆对象(创建对象的副本) 8.把对象解析成字符串 PS,学会从内存的角度看代码.想象计算机的微观世界. 静态方法的小例子 <?php class StaticExample{ stat

Android夜间模式最佳实践

由于Android的设置中并没有夜间模式的选项,对于喜欢睡前玩手机的用户,只能简单的调节手机屏幕亮度来改善体验.目前越来越多的应用开始把夜间模式加到自家应用中,没准不久google也会把这项功能添加到Android系统中吧. 业内关于夜间模式的实现,有两种主流方案,各有其利弊,我较为推崇第三种方案: 1.通过切换theme来实现夜间模式. 2.通过资源id映射的方式来实现夜间模式. 3.通过修改uiMode来切换夜间模式. 值得一提的是,上面提到的几种方案,都是资源内嵌在Apk中的方案,像新浪微

关于Flyweight模式应用实践的相关介绍

什么是Flyweight模式? 享元模式(Flyweight Pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,来避免大量创建拥有相同内容的对象的开销.可以简单理解用空间换取时间. 举例说明 一般的设计模式解释中都会用到如下两种场景来解释Flyweight Pattern: 1.GUI字处理软件中每个文字都是对象,缓存这些对象公用.2.字符串驻留技术(String Interning).具体实现 复制代码 代码如下: /// <summary>  /// 享元模式

老生常谈PHP面向对象之解释器模式

最近在看 "深入PHP面向对象模式与实践" ,学习书中的内容后瞬间觉得自己有点高大上了,哈 ! 其实还是个菜B.相信也会有新手朋友在看这本(我自己也是新手),对书中我个人认为比较难的内容的学习心得就想拿出来分享和交流,1是希望对自己所学知识能够起到巩固和加深理解的作用 2是希望对看到本文且感兴趣的新手朋友一些帮助. 这部分内容看了好几遍了代码也跟着敲了几遍,估计本文想要实现的功能大概就是用户在web页面上输入一些内容,然后通过后台程序解析后进行回复(感觉就是在废话).例如我在前台web

PHP面向对象之领域模型+数据映射器实例(分析)

这里要说明一下 因为本人比较懒 博客中相关文章的内容更多的是对<深入PHP面向对象.模式与实践>一书中代码的整理和简单注解方便自己日后复习和参考, 对相关内容感兴趣的初学的朋友建议请先阅读原文.此处的内容只能当成一种学习的补充和参考.谢谢! 因原书中领域模型+数据映射器的示例代码是连贯在一起的 所以这里就整理在一起了. 简单介绍一下我的看法,从数据库操作的角度看领域模型主要是操作数据表中的单条记录的而数据映射器是操作整个数据表的数据的. 按原文的解释数据映射器是一个负责将数据库数据映射到对象的

Android编程实现夜间模式的方法小结

本文实例讲述了Android编程实现夜间模式的方法.分享给大家供大家参考,具体如下: 随着APP实现的功能越来越丰富, 看小说看视频上网等等, 现在不少人花在手机平板等移动终端上的时间越来越长了. 但手机和平板的屏幕并不像Kindle那类电纸书的水墨屏那么耐看, 由于自发光的屏幕特性, 我们长期盯着屏幕看容易眼睛酸痛疲倦, 因此各种护目模式, 夜间模式在移动APP上得到广泛应用, 这的确也是一个贴心的小功能. 所以这次我们探讨下几种实现方式, 一起学习总结下: 1. 利用屏幕亮度 当夜间使用手机

深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP

前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http://freshbrewedcode.com/derekgreer/2011/12/31/solid-javascript-the-liskov-substitution-principle/ 复制代码 开闭原则的描述是: Subtypes must be substitutable for the