PHP动态设计的设计流程,《PHP设计模式介绍》第十四章 动态记录模式

到目前为止,您所看到的这些设计模式大大提高了代码的可读性与可维护性。然而,在WEB应用设计与开发中一个基本的需求与挑战:数据库应用,这些设计模式都没有涉及到。本章与接下来的两章—表数据网关与表数据映射,提供了三种设计模式使您能更好的组织你的应用程序与数据库进行交互。

问题

大多数WEB应用将信息持续保存在数据库中。有将数据库操作抽象化,以达到简化表数据存取和对业务逻辑的集成存取方法吗?

解决方案

理论上,动态记录模式是最简化的有关数据库的设计模式。动态记录模式包含了如何在类中直接实现与数据库交互的相关知识。

动态记录模式在程序代码与数据库结构之间产生了一种很高的结合度,在一些相对简单的应用环境中,就能比采用别的复杂方案更容易解决这种因结合所产生的一些固有问题。动态记录模式也能满足许多初级的数据库项目。只有当复杂性增加而难以用动态记录模式处理时,你才有必要使用表数据网关模式(参见15章),或是数据地图模式(参见16章)或是别的数据库设计模式

企业级应用架构模式

根据Martin Fowler’s的著作《企业级应用架构模式》,所谓企业级应用就是与别的应用集成化,包含了重要的业务逻辑(或如应用需求所呈现的非逻辑的东西),并且具有许多并发存取和保存从各种接口取得的数据。有趣的是,web应用正好具备了上述多个特点,这正好能解释为什么Martin Fowler’s的著作能引起PHP程序员的强烈反响。

PHP数据对象

PDO是一个高性能的数据库通道接口(并非数据库抽象)。PDO是一个由C语言构成的本地驱动包,因此其速度是很快的。PDO为所有的PDO驱动提供了申明,增强了脚本使用库时的安全性。

样本代码

任何对数据库连接的讨论都依赖于对数据库系统与对数据库访问层的选择。本章与随后两章都使用MYSQL(http://www.mysql.com/)这个流行的开源数据库及ADOdb (http://adodb.sf.net/)作为数据库访问层。我将ADOdb作为我自己工作室的标准是因为它优异的性能,且抽象了Oracle OCI接口,并提供了统一的访问PostgreSQL, Sybase, MySQL和其它数据库的接口,而成为了易于使用的PHP API,让你专注于程序与业务逻辑的处理。

放心的替换你的自己的数据库与访问层,因为这里提出的许多概念也适合于别的解决方案。

在研究t动态记录模式之前,让我们从基本的数据库连接开始。有一个集中的,简单的方式去指定连接参数(主机名,用户名,密码,数据库)并建立一个数据库连接对象是很理想的。一个单一模式对象(参见第四章)就非常适合了。

这是一个DB类,其conn()方法返回一个单一模式的ADOConnection类的实例。

//  PHP5

require_once  ‘adodb/adodb.inc.php’;

class  DB  {

//static  class,  we  do  not  need  a  constructor private  function  __construct()  {}

public  static  function  conn()  {

static  $conn;

if  (!$conn)  {

$conn  =  adoNewConnection(‘mysql’);

$conn->connect(‘localhost’,  ‘username’,  ‘passwd’,  ‘database’);

$conn->setFetchMode(ADODB_FETCH_ASSOC);

}

return  $conn;

}

}

DB类允许你设定数据库的类型与连接参数。第一行代码将ADOdb库包含进来(你可能需要根据你的实际环境来调整路径);因为没有必要每次都实例化DB,所以DB的构造函数是私有的; 行$conn->setFetchMode(ADODB_FETCH_ASSOC)设定对象返回的记录集是以(字段名=>值)形式的关联数组。与数据库打交道中采用关联数组是非常重要的经验习惯,这样您的代码就不会受到因SQL语句中字段排序而产生的影响。

作为示例程序,让我们建立一个Active Record对象来维护一个超链接表。以下是一个在MySQL数据库中建立这个超链接表的SQL。

define(‘BOOKMARK_TABLE_DDL’,  <<

CREATE  TABLE  `bookmark`  (

`id`  INT  NOT  NULL  AUTO_INCREMENT  ,

`url`  VARCHAR(  255  )  NOT  NULL  ,

`name`  VARCHAR(  255  )  NOT  NULL  ,

`description`  MEDIUMTEXT,

`tag`  VARCHAR(  50  )  ,

`created`  DATETIME  NOT  NULL  ,

`updated`  DATETIME  NOT  NULL  , PRIMARY  KEY  (  `id`  )

) EOS

);

实验的独立性

各个实验间应是相互独立的;否则,仅仅是运行了某一个实验就会影响到后续实验的结果。

为了避免这些都基于同一数据库的实验间相互干扰,最好是在每个测试开始前删除并重建相关表。以下简单的实验为后续实验提供了一种标准的setup方法。

以下代码演示如何在每个实验开始前重置你的数据库:

class  ActiveRecordTestCase  extends  UnitTestCase  {

protected  $conn;

function  __construct($name=’’)  {

$this->UnitTestCase($name);

$this->conn  =  DB::conn();

}

function  setup()  {

$this->conn->execute(‘drop  table  bookmark’);

$this->conn->execute(BOOKMARK_TABLE_DDL);

}

}

这段代码用一个标准的ADOConnection对象来给$conn的属性赋值,并且使用了Connection的execute()方法来执行SQL删除与重建表的操作。因为这些代码在一个名为setup()的方法中,使得每一个实验都能在一个新的数据库环境中工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(54):接口之间的继承

定义一个接口类 //接口 interface interface4 { public abstract void fly(); public abstract void eat(); } //定义一个老鹰类 public class interface3 implements interface4{ public void fly(){ System.out.println(“我是老鹰&#xff0c;我会飞”); } public void eat…

php addall,深入解析thinkphp中的addAll方法

原因&#xff1a;在做中控系统中遇到了一个给用户批量分配角色的问题&#xff0c;刚开始想到的是循环插入&#xff0c;但立马给否定了&#xff0c;循环操作数据库开发者的大忌啊&#xff0c;于是查找手册找到数据写入看到批量操作&#xff1a;addAll(),测试成功&#xff0c;以为…

Java排查问题随笔

常言道&#xff1a;“好记性不如烂笔头”&#xff0c;确实很有道理。在日常工作中&#xff0c;偶尔处理下线上问题还是很常见的&#xff0c;经常出现的情况就是忘记一些常用命令&#xff08;套路&#xff09;的用法了&#xff0c;因此整理下来非常用必要&#xff0c;以便关键时…

java学习(55):定义一个抽象类的继承

不同的是定义一个抽象类先 //抽象类 public abstract class interface4 { public abstract void fly(); public abstract void eat(); } //定义老鹰类继承 /定义一个老鹰类 public class interface3 extends interface4{ public void fly(){ System.out.println(“我是老鹰&…

可持久化线段树学习笔记

可持久化线段树&#xff0c;即主席树。 每次修改的时候不修改原来的节点&#xff0c;暴力建新节点&#xff0c;充分运用了函数式编程的思想。 模板题&#xff1a;给定一个数列&#xff0c;\(m\) 次询问求区间 \([l,r]\) 内的第 \(k\) 大。 利用前缀和思想&#xff1a; #include…

wordpress functions.php 在哪,在functions.php中定义变量并在WordPress中的函数钩子中访问它们...

我想更详细地了解Wordpress结构.正如我所知,使用全局关键字并不是一个好主意.这是我想要完成的&#xff1a;Inside functions.php$affID 12334; //defining a variableadd_shortcode(affiliate_link, function() {$newLink https://example.com?id . $affID;return $newLink…

java学习(56):接口之间的继承续

//定义一个接口&#xff0c;里面放置多个方法 public interface CountManagement { double count(double n,double m,char tag); double count(double up,double down,double h); double eqAax(double num1,double num2); } //定义一个接口&#xff0c;里面需要实现多个方法 pu…

[UE4]单机游戏改网络游戏,不完全清单

把Actor的复制打开中腰数据的复制打开&#xff0c;且只在服务器修改&#xff08;比如角色属性血量&#xff09;需要同步的Actor&#xff0c;不在客户端Spawn客户端的操作&#xff0c;先报告到服务器&#xff0c;服务器再广播到所有客户端某些逻辑只在服务器运行&#xff08;比如…

java学习(57):内部类

/** 2 * 1.内部类可以直接访问外部类的成员&#xff0c;包括私有 3 * 2.外部类要访问内部类的成员必须创建对象 4 * author jjz 5 * 6 */ public class outer { //外部定义的方法 public void play(){ System.out.println(“我喜欢打篮球”); } public static void main(String…

php对接ai图片处理,php – 使用imagick将.psd和.ai转换为PNG / JPG

我解决了它,并将与世界分享&#xff01;它会将.ai,.psd,.jpg,.png,.gif转换为缩略图.这是一个需要4个参数的函数&#xff1a;$dir – 要保存的目录.$tmpName – 命名不包括扩展名的文件的名称.$fileType – 自解释.$size – 大或小.function thumbGenerator($dir,$tmpName,$fil…

python初识

1.python的简介   python是一门解释型&#xff0c;弱类型 高级开发编程语言. 2.python安装 (1)python3.x  https://www.python.org/downloads/ (2)pycharm  https://www.jetbrains.com/pycharm/ 3、编写第一个python程序 符号&#xff1a;英文 编码方式&#xff1a;“utf-8…

java学习(58):私有内部类后访问

私有化外部方法访问 public class outer { //外部定义的方法 private class student { public void play() { System.out.println(“只有学生才会喜欢打篮球”); } } public void teacher() { student stu new student(); stu.play(); } public static void main(String[] arg…

java学习(59):static修饰内部类

class Outer { private int num 10; private static int num2 100; //内部类用静态修饰是因为内部类可以看出是外部类的成员public static class Inner {public void show() {//System.out.println(num);System.out.println(num2);}public static void show2() {//System.out…

Python_自定义关键字的使用

1.在Python中新建一个套件MOSAPP&#xff08;一般为APP名称&#xff09;&#xff1a;New Suite→Directory 2.在套件下新建个资源文件My&#xff1a;New Resource:My 3.在My资源文件库下新建个关键字Mytest&#xff1a;New User KeyWord&#xff1a;Mytest 4.在01smoke下新建一…

php http请求xml数据,使用php从HTTP POST请求中检索XML

我检查了类似的问题但没有解决我面临的问题.我正在构建一个Web服务,我想从HTTP POST请求中检索XML数据,操纵数据并返回响应.编写脚本时应考虑以下信息&#xff1a;The communication mode is HTTP POST (not SOAP)The content type is text/xml.The POST request will contain …

java学习(60):java最终类(了解)

最终类 使用关键字 final 对类进行修饰. [访问控制符] final class 类名 { 类体} 例如: public final class MyClass{ ... } 说明: final 不能当做父类, 不能被继承,不能有子类 , 只能被实例化对象 . 如果认为封装类中的某些数据(成员变量) 或者 某些方法(成员方法) 不能…

Lesson 028 —— python 模块

Lesson 028 —— python 模块 在前面的几个章节中我们脚本上是用 python 解释器来编程&#xff0c;如果你从 Python 解释器退出再进入&#xff0c;那么你定义的所有的方法和变量就都消失了。 为此 Python 提供了一个办法&#xff0c;把这些定义存放在文件中&#xff0c;为一些脚…

java 复杂报表,Java报表比较之中国式报表(复杂报表)篇

Java报表工具&#xff0c;首先可以分成两大类&#xff1a;纯Java报表工具&#xff0c;和支持Java的报表工具。支持Java的报表工具我们所说的”支持”Java的报表工具&#xff0e;其实就是非Java的报表工具&#xff0c;但是可以在Java程序中调用.这样的产品很多&#xff0c;总的讲…

java学习(61):适配器

定义一个动物的抽象类 public abstract class Animal { //定义一个抽象类的方法 public abstract void run(); //定义一个抽象类的构造器 public Animal(){ System.out.println(“抽象类的构造器”); } } 定义一个哺乳动物的抽象类 package com.zx; abstract class Mammal ext…

9个图片滑块动画

链接&#xff1a;https://www.html5tricks.com/9-jquery-image-slider.html 实例&#xff1a; 该实例下载链接&#xff1a;https://www.html5tricks.com/jquery-drag-image-slider.html 转载于:https://www.cnblogs.com/wanlibingfeng/p/9915376.html