php设计模式探秘(1)-封装

概况

如何让编程变得更简单?
这里,我们尝试用“设计模式”,去解决一些复杂的逻辑问题。为了便于理解,我们先从“封装”开始逐渐引入设计模式;也为了便于理解 ,我们通篇采用一个电影网站来作为需求的背景。

封装

我们的电影网站,首先有一个电影列表页。它从数据库抓取多条电影数据,并通过html展示出来,代码大致如下:

  1. <?php
  2. // List.php
  3. $offset = isset($_GET[‘offset‘]) ? $_GET[‘offset‘] : 0;
  4. $length = isset($_GET[‘length‘]) ? $_GET[‘length‘] : 8;
  5. $pdo = new PDO(‘mysql:host=localhost;dbname=movie‘, ‘root‘, ‘‘);
  6. $sql = ‘select * from movie limit :offset,:length‘;
  7. $pdoStatement = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
  8. $pdoStatement->execute(array(‘:offset‘ => $offset, ‘:length‘ => $length))
  9. $data = $pdoStatement->fetchAll(PDO::FETCH_ASSOC);
  10. $html = ‘‘;
  11. foreach ($data as $record) {
  12. $html .= sprintf(‘<li><a href="detail.php?id=%s">%s</a></li>‘,$record[‘movieId‘], $record[‘name‘]);
  13. }
  14. echo sprintf(‘<ul>%s</ul>‘, $html);

这里,我们采用pdo方式去查询数据库,然后循环输出html来显示电影列表。很显然,实际项目中,数据库的查询要不断的被重复使用,如果都像这么源码重复编写的的话,项目将变得麻烦而又难以维护。于是,我们尝试着“把重复的部分封装起来”,当然,可以用函数,这是一种比较简单的封装手法;也可以用类,这种封装手法能给我们提供更多的特性。这里,我们采用类,代码如下:

  1. <?php
  2. // Connection.php
  3. class Connection
  4. {
  5. private $connection = ‘‘;
  6. public function __construct()
  7. {
  8. $this->connection = new PDO(‘mysql:host=localhost;dbname=test‘, ‘root‘, ‘‘);
  9. }
  10. // 获取多行数据
  11. public function getAll($sql)
  12. {
  13. return $connection->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  14. }
  15. ... // 更多的数据操作方法
  16. }

封装后,列表页的代码简化为:

  1. <?php
  2. // List.php
  3. require ‘Connection.php‘;
  4. $offset = isset($_GET[‘offset‘]) ? $_GET[‘offset‘] : 0;
  5. $length = isset($_GET[‘length‘]) ? $_GET[‘length‘] : 8;
  6. $db = new Connection();
  7. $data = $db->getList(‘select * from movie limit :offset,:length‘, array($offset, $length));
  8. $html = ‘‘;
  9. foreach ($data as $record) {
  10. $html .= sprintf(‘<li><a href="detail.php?id=%s">%s</a></li>‘,$record[‘movieId‘], $record[‘name‘]);
  11. }
  12. echo sprintf(‘<ul>%s</ul>‘, $html);

很明显,列表页的代码变得简洁,也更容易理解了。
我们通过编程语言提供的封装手法,提取出了代码中的重复部分。这样,能让我们少写很多代码,而且还能让调用者的代码变得更加简洁。就“如何让编程变得更简单”而言,”把代码封装起来“便成了一个很不错的思路。

而封装本身还给我们带来另外一个好处,那就是封装了变化。
我们假设现在需要加入一种重试机制,多次尝试连接数据库,以防数据库不稳定带来的连接失败。在现有封装好的代码里,我们只需要修改数据库连接的局部代码,而List.php里面对Connection的调用代码,我们就基本不需要关心。由于封装的缘故,这种改变对于List.php是不可见的。具体实现如下:

  1. class Connection
  2. {
  3. private $connection = ‘‘;
  4. public function __construct()
  5. {
  6. $count = 0;
  7. $connection = false;
  8. while(empty($connection) && $count < 3) {
  9. $connection = new PDO(‘mysql:host=localhost;dbname=test‘, ‘root‘, ‘‘);
  10. $count++;
  11. }
  12. $this->connection = $connection;
  13. }
  14. // 获取多行数据
  15. public function getAll($sql){...}
  16. ... // 更多的数据操作方法
  17. }

封装的这种特性,能让我们在很小的范围内,应对需求的优化和修改,很是方便。当然,有时候我们会发现封装出来的东西,并不是那么友好。这很大程度上取决于你封装时抽象的角度,抽象和封装,本身就是一件很见功夫的事情。不管怎样,尝试着去封装一些东西吧,你很快会发现,这么做是多么的神奇和有趣。

时间: 2024-10-24 20:04:17

php设计模式探秘(1)-封装的相关文章

读书笔记之 - javascript 设计模式 - 接口、封装和链式调用

javascript 采用设计模式主要有下面的三方面原因: 可维护性:设计模式有助于降低模块之间的耦合程度.这使代码进行重构和换用不同的模块变得容易,也使程序员在大型项目中合作变得容易. 沟通:设计模式为处理不同类型的对象提供了一套通用的术语.程序员可以简洁的描述自己系统的工作方式. 性能:采用一些优化性能的模式,可以大幅度提高程序的执行效率,如享元模式和代理模式等 同时,滥用设计模式也会带来一些后果: 复杂性:代码变得复杂,新手难以理解 性能:多数设计模式会或多或少的降低代码的性能 实现容易,

javascript设计模式系列二-封装

JavaScript封装: var Book = function (id, name, price) { this.id = id, this.name = name, this.price = price } Book.prototype.display = function () { //展示书本 } var book = new Book(10, 'js', 30); book.display(); console.log(book.name); 问题:通过this和prototype添

IOS开发之单例设计模式

本文将从四个方面对IOS开发中的单例设计模式进行讲解: 一.什么是单例设计模式 二.我们为什么要用单例设计模式 三.单例设计模式的基本用法 四.自定义单例设计模式代码的封装 一.什么是单例设计模式 所谓单例,即是单个的实例化对象,保证一个类有且仅有一个实例.通常情况下,当我们对一个类实例化时(如:alloc.new等),并不能保证每次实例化的对象是唯一的实例.那么为了保证该类可在多次实例化的过程中保证内存地址不变,就需要引入单例设计模式. 二.我们为什么要用单例设计模式 1.Singleton

设计模式学习笔记(十二:生成器模式)

1.1概述 将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示.这就是生产器模式的定义. 如果一个类中有若干个成员变量是其他类声明的对象,那么该类创建的对象就可以包含若干个其他对象作为其成员.习惯上把一个对象中的成员对象称作它的组件,例如,几何(Geometry)类含有三角形(Triangle)类.矩形(Rectangle)类和圆(Circle)类声明的对象,那么几何类就可以创建一个由三角形.矩形和圆形组成的几何图形,三角形.长方形和圆形就是当前几何图形中的组件. 但是,在编

android 开发 - 使用okhttp框架封装的开发框架

概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 oknet是一套基于okhttp的android网络http框架,封装了请求参数处理,日志打印. Github地址 https://github.com/vir56k/oknet 特性 1.简洁的语法 2.支持自定义处理 message code 不等于0 的情形 3.支持文件上传 4.完整清晰的l

iOS 设计模式

Ios 设计模式,你可能听说过,但是你真正知道这是什么意思么?大部分的开发者大概都同意设计模式很重要,但是关于这一部分却没有很多的文章去介绍它,我们开发者很多时候写代码的时候也并不重视设计模式. 设计模式是在软件设计上去解决普通问题的可重用的方法.他们是是帮助你让所写的代码更加容易理解和提高可重用性的模板.它们还可以帮你创建松散耦合的代码是你能不费很大功夫就可以改变或者替代你的代码中的一部分. 如果你对设计模式感到生疏,那么我有个好消息告诉你!首先,你已经用了很多ios设计模式多亏了Cocoa

设计模式-总起

1 什么事设计模式 设计模式是面向对象设计模式的简称. 他是在面型对象编程中,认为总结的出列某一类,或是某一特定场景问题的最优实践. 因此,设计模式可以理解为解决某一类问题的一种模式,固定的模式. 2 设计模式与面向对象 在面向对象编程中,当类与类之间存在继承的关系,那么类之间就是高耦合的.当后期维护的时候会面临牵一发而动前身的后果. 而设计模式是为了封装变化,让各个模块可以独立变化.使得代码优雅,易于扩展.这个过程称为解耦. 同时,在交流中, 最常见的就是,A类使用B类的基类作为参数或是关联B

从零开始单排学设计模式「策略模式」黑铁 II

阅读本文大概需要 1.7 分钟. 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了,也算是自己的一个回顾吧! 学而时习之,不亦说乎. 推荐阅读: 从零开始单排学设计模式「UML类图」定级赛 从零开始单排学设计模式「简单工厂设计模式」黑铁III 目前段位:黑铁 II Let's Go! 前言 设计模式不是语法,是一种巧妙的写法,能把程序变的更加灵活.架构模式比设计模式大,架构模式是战

深入理解设计模式(终):总结--设计模式是药,没病就不要吃药

系列链接地址: 深入理解设计模式---系列目录 一.产品汪的神助攻,代码狗的安慰剂 定义:设计模式,指的是一个场景(context)下的一种解决方法(Solution),只要大家都认可某种模式,那么就只需要很短的一个名字,就可以代替很多很多的语言和文字交流,如果你觉得设计模式降低生产效率,那只能说你在这一行还要继续修炼. 宗旨:保证系统的低耦合高内聚,指导它们的原则无非就是封装变化,责任单一,面向接口编程等设计原则 目的:就是为了让代码变得更容易理解和维护 精髓:将复杂的逻辑抽离出来,让开发人员