当前位置:首页 > 编程教程 > php技术文章 > 老生常谈PHP面向对象之标识映射

PHP面向对象之标识映射图文详解

  • 发布时间:
  • 作者:码农之家
  • 点击:193

这篇文章主要知识点是关于PHP、标识映射、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

PHP+MySQL动态网站开发从入门到精通
  • 类型:PHP网站开发大小:36.2 MB格式:PDF作者:张工厂
立即下载

Tags:

老生常谈PHP面向对象之标识映射

标识映射在数据映射器的基础上增加了标识映射类,主要功能是保存已经创建好的对象,在需要的时候可以直接获取而不是重复创建造成系统性能的下降。

在数据映射器基础上还增加了部分调用标识映射类的方法,示例代码如下:

namespace woo\domain;

//标识映射类
class ObjectWatcher{
  
  private $all = array();        //存放对象的小仓库
  private static $instance;      //单例
  
  private function __construct (){}
  
  static function instance(){
    if(!self::$instance){
      self::$instance = new ObjectWatcher();
    }
    return self::$instance;
  }
  
  //获取一个唯一的标识,这里采用了领域类类名+ID的方式创建一个唯一标识,避免多个数据库表调用这个类时出现ID重复的问题
  function globalKey(DomainObject $obj){
    $key = get_class($obj) . "." . $obj->getId();
    return $key;
  }
  
  //添加对象
  static function add(DomainObject $obj){
    $inst = self::instance();
    $inst->all[$inst->globalKey($obj)] = $obj;
  }
  
  //获取对象
  static function exists($classname,$id){
    $inst = self::instance();
    $key = "$classname.$id";
    if(isset($inst->all[$key]){
      return $inst->all[$key];
    }
    return null;
  }
}

namespace woo\mapper;

abstract class Mapper{      //抽象基类
  abstract static $PDO;    //操作数据库的pdo对象
  function __construct (){
    if(!isset(self::$PDO){
      $dsn = \woo\base\ApplicationRegistry::getDSN();
      if(is_null($dsn)){
        throw new \woo\base\AppException("no dns");
      }
      self::$PDO = new \PDO($dsn);
      self::$PDO->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
    }
  }
  
  //数据映射器基础上新增的方法以下会简称新增,这里的作用的是获取对象而不是查询数据库并重复创建对象
  //(对比一下原数据映射器的相关代码即可了解)
  private function getFroMap($id){
    return \woo\domain\ObjectWatcher::exists($this->targetClass(),$id);
  }
  
  //新增,这里的作用的是将创建的对象保存起来
  private function addToMap(\woo\domain\DomainObject $obj){//////
    return \woo\domain\ObjectWatcher::add($obj);
  }
  
  
  //对比原数据映射器的代码,便发现它不是直接创建对象而是首先在标识映射类中查找,找不到才调用的
  //子类的方法创建并插入到标识映射类,下面的find方法也遵循了这一原则
  function createObject($array){          
    $old = $this->getFromMap($array['id']);  //新增
    if($old){return $old}          //新增
    $obj = $this->doCreateObject($array);  //在子类中实现
    $this->addToMap($obj);          //新增
    return $obj;
  }
  
  //
  function find($id){                //通过ID从数据库中获取一条数据并创建为对象  
    $old = $this->getFromMap($id);        //新增
    if($old){return $old}            //新增
    
    $this->selectStmt()->execute(array($id));
    $array= $this->selectStmt()->fetch();
    $this->selectStmt()->closeCursor();
    if(!is_array($array)){
      return null;
    }
    if(!isset($array['id'])){
      return null;
    }
    $object = $this->createObject($array);
    $this->addToMap($object);          //新增
    return $object;  
  }
  
  function insert(\woo\domain\DomainObject $obj){      //将对象数据插入数据库
    $this->doInsert($obj);
    $this->addToMap($obj);            //新增
  }
  
  //需要在子类中实现的各抽象方法
  abstract function targetClass();//////
  abstract function update(\woo\domain\DomainObject $objet);
  protected abstract function doCreateObject(array $array);
  protected abstract function selectStmt();
  protected abstract function doInsert(\woo\domain\DomainObject $object);
}

class SpaceMapper extends Mapper {
  //其他代码在数据映射器一文中已有实现这里略过
  //.............
  
  //类名,在标识映射类中生成唯一标识用的
  protected function targetClass(){
    return "woo\\domain\\Space";
  }
}

以上这篇老生常谈PHP面向对象之标识映射就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

PHP 相关电子书
学习笔记
网友NO.384359

thinkPHP5.0框架安装教程

本文实例讲述了thinkPHP5.0框架安装方法。分享给大家供大家参考,具体如下: ThinkPHP5的环境要求如下: PHP = 5.4.0 PDO PHP Extension MBstring PHP Extension CURL PHP Extension 严格来说,ThinkPHP无需安装过程,这里所说的安装其实就是把ThinkPHP框架放入WEB运行环境(前提是你的WEB运行环境已经OK),可以通过两种方式获取和安装ThinkPHP。 一、下载ThinkPHP安装 获取ThinkPHP的方式很多,官方网站(http://thinkphp.cn)是最好的下载和文档获取来源。 官网提供了稳定版本的下载:http://thinkphp.cn/down/framework.html 二、使用Composer安装 ThinkPHP支持使用Composer安装,如果还没有安装 Composer,你可以按 Composer安装 中的方法安装。在 Linux 和 Mac OS X 中可以运行如下命令: curl -sS https://getcomposer.org/installer | phpmv composer.phar /usr/local/bin/composer 在 Windows 中,你需要下载并运行 Composer-Setup.exe 。 如果遇到……

网友NO.371301

示例讲解php+mysql查询实现无限下级分类树输出

本文实例讲述了php+mysql查询实现无限下级分类树输出。分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类。给各位整理了几个php无限分类的例子. 树输出: function get_array($user_id,$top=0){global $mysql,$_G; $sql = select user_id as name from `{spreads_users}` where p1.spreads_userid={$user_id};$rows= $mysql-db_fetch_arrays($sql); if($top==1){ $arr[0][name]=$user_id; $arr[0][children]=array(); } $top=$top+1;foreach ($rows as $key=$value) { $r = get_array($value[name]); //调用函数,传入参数,继续查询下级 $arr[0][children][$key][name]= $value[username]; //组合数组 if(is_array($r)){ $arr[0][children][$key][children]= $r[0][children]; } $i++; } return $arr; }$list = get_array(1000,1); //调用函数1000是顶级IDecho var data=.json_encode($list); 这个是输出 Array 然后转让为 json 例子: 表结构:id字段为分类标识,name字段为分类名,f……

网友NO.738337

PHP反射API示例分享

本文实例为大家分享了 PHP反射API--利用反射技术实现的插件系统架构,供大家参考,具体内容如下 ?php/** * @name PHP反射API--利用反射技术实现的插件系统架构 *//** * 先调用findPlugins方法获取到获取到实现了接口的类 * 然后调用反射类的方法 * @param $method 方法名 * @param $interfaceName 接口名 * @return array 方法名对应的返回结果 */function compute($method,$interfaceName){ $findPlugins = findPlugins($interfaceName); $menu = array(); foreach ($findPlugins as $plugin){ //这里获取到实现Iplugin接口的所有的类 if ($plugin-hasMethod($method)) { //检查在类中特定的方法是否被定义。 $reflectionMethod = $plugin-getMethod($method); //获取类中的方法 if ($reflectionMethod-isStatic()) { //判断其方法是否为静态方法 $items = $reflectionMethod-invoke(null); } else { $pluginInstance = $plugin-newInstance(); //创建类的新实例。给定参数传递给类构造函数。……

网友NO.963903

php微信公众号开发之翻页查询

本文为大家分享了php微信公众号开发之翻页查询的具体代码,供大家参考,具体内容如下 注意: 公众号列表最多只能列出8列,超出会报错 分页原理 limit 开始位置 , 条数 (当前页数 - 1) x 每页条数 , 每页条数 limit ($Page - 1) * $PageSize , $PageSize 0 为开始位置 mysql_num_rows 条数 require() 与 require_once() 开始加载,错误停止 include() 与 include_once() 使用加载,错误跳过 ceil 进一 向上取整 原理: 总共10条,每页9条 n条 sum 总共几页 ceil ( n / 9 ) 开始条数 : (当前页数 - 1 ) x 每页条数 (key - 1)* 9 注释:+1 是为了说明有多少页 10 10 核心代码如下: $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj-FromUserName; $toUsername = $postObj-ToUserName; $type = $postObj-MsgType; $customevent = $postObj-Event; $latitude = $postObj-Location_X; $longitude = $postObj-Location_Y; $keyword = t……

<
1
>

电子书 编程教程 PC软件下载 安卓软件下载

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757