不错的一篇面向对象的PHP开发模式(简写版)

我看到有人在批判PHP,什么这地方不好用,那地方不好用的。其实严格地说起来,没有一门语言好用,也没有一门语言有一个严格的标准,凡事都有一个发展的过程,我们总不能等这些标准呀什么的都很完善了再用吧?我觉得不管用什么语言,写程序都要靠自己,一个程序员要有好的风格,思路等等。最近我在整理一些资料,现在发出一些,希望大家多提意见,多多扶持啊哈

======================================
面向对象的PHP开发模式(待完善中。。。)
======================================

一、环境
  服务器:Linux (Apache 2.x, MySQL4.1.x, PHP4, Perl, SHELL, CVS, Sambar)
  客户端:Windows (Ie6, UltraEdit, 其它辅助工具)
  测试机:windows98/2K/xp/Linux (Ie5, Ie6, mozilla, firefox)

二、网页、程序、数据库的三层
  所谓的网页并不是一般的静态网页,这里的网页是根据项目分析的具体情况进行拆分
后用html做的模板;这里的数据库包括数据库和与其它部分的接口程序,通常程序和数据库
程序可能会混合在一个文件里,但应该用函数的方式把它们尽量分开,其它程序如果要用数
据库直接调用这些函数即可,不能直接接触SQL语句。

三、项目分析--数据分析
  一个项目在得到需求分析后,实际开发前第一步应该做的就是数据分析。数据分析就是
把项目过程中要用到的各式各样的数据堆在一块,根据它们的特点进行分类再分别组织,当
然它们之间还可能存在着各式各样的关联关系。做好这一步就使项目分析工作得到了一个良
好的开端,为下面的项目结构分析及数据处理的流程分析也提供了极大的方便。

四、项目分析--数据抽象
  由数据分析后我们的脑子中应该能出现一些大致的数据模型及一些基本数据小模型组合
而成的大模型,一般情况下,我们把一些需要变化的数据建立数据库来进行维护,不需要变
化的数据做成一些常量,并针对这些数据类型抽象出相关的类,并建立进行数据库操作的相
关接口(函数形式,即方法),数据与数据的相关联的操作也可以抽象出一些基本的方法,
我们只需要在程序设计中进行调用即可。

五、项目分析--界面分析
  我们分析好了数据,目的是组合出一个或者几个产品,而既然要做产品就要给别人看。
所以我们还要进行界面设计,当各种界面尽量考虑全面后,就将设计的界面制作成模板,并
写出相应的处理接口程序(所以,在程序眼里,界面也是一种数据),在写程序时进行使用。

六、项目分析--流程设计
  网站式程序非常简单,按照流程调用我们设计好的各种数据即可。

七、案例分析
  用户系统,现在我们分析一个最简单的例子,一个用户系统。
  1. 数据分析,我们分析一个最简单的用户系统,所以这里只有两个数据,那就是用户名
和密码,继续分析还会想到我们应该给每条记录加一个编号(id),现在有了三个数据,实在没
有再可以添加的了。
  2. 数据抽象,只有三个数据的数据模型,想到它可能出现的操作方法,我们做如下安排,
数据库接口(savetodb(), getfromdb(), delete()),分别为数据入库及出库还有删除;更改密
码(password())。另外考虑到对用户系统的管理及查看,所以会有一个集合类型的数据(list)。
  3. 界面分析,登陆,验证成功,验证出错,修改密码,修改密码成功,修改密码出错,用
户注册,注册成功,注册出错;管理--用户列表,管理--用户信息查看,管理--修改用户
密码,管理--删除用户。
  4. 示例代码
PHP 代码:


代码如下:

<?php

include_once "include.php"; 
/* 
** 用途:用户系统数据抽象 
** 作者:岳信明 
** 时间:2005-8-30 10:05 
*/ 
class User { 
    var $id       = 0; 
    var $Name     = ""; 
    var $Password = "";

var $db       = ""; 
    var $tpl      = "";

/* 
    ** 函数功能:构造函数,指定类使用的数据库连接 
    ** 参数说明:$tpl,显示模板处事句柄;$userdb,数据库连接 
    ** 返 回 值:无 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 10:37 
    */ 
    function User($vtpl = "", $userdb = "") { 
        if ($vtpl == "") { 
            global $tpl;    // 外部定义数据库连接 
            $this->tpl =& $tpl; 
        } else { 
            $this->tpl = $vtpl; 
        } 
        if ($userdb == "") { 
            global $db;    // 外部定义数据库连接 
            $this->db =& $db; 
        } else { 
            $this->db = $userdb; 
        } 
    } 
    /* 
    ** 函数功能:将数据存入数据库 
    ** 参数说明:无参数 
    ** 返 回 值:true/false,成功/失败 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 10:24 
    */ 
    function savetodb() { 
        if ($this->Name == "") { 
            return false; 
        } 
        if ($this->id) { 
            $strSQL = sprintf("UPDATE user SET Name='%s', Password='%s' " 
                            . "WHERE id='%s'", 
                              $this->Name, 
                              $this->Password, 
                              $this->id 
                             ); 
        } else { 
            $strSQL = sprintf("INSERT user (Name, Password) " 
                            . "VALUES ('%s', '%s')", 
                              $this->Name, 
                              $this->Password 
                             ); 
        } 
        if ($this->db->query($strSQL)) { 
            return true; 
        } else { 
            return false; 
        } 
    }

/* 
    ** 函数功能:从数据库中获取记录 
    ** 参数说明:$id,记录编号 
    ** 返 回 值:true/false,成功/失败 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 10:32 
    */ 
    function getfromdb($id = 0) { 
        if ($id) { 
            $strSQL = sprintf("SELECT * FROM user WHERE id='%s'", $id); 
        } else if ($this->id) { 
            $strSQL = sprintf("SELECT * FROM user WHERE id='%s'", 
                              $this->id 
                             ); 
        } else if ($this->Name != "") { 
            $strSQL = sprintf("SELECT * FROM user WHERE Name='%s'", 
                              $this->Name 
                             ); 
        } else { 
            return false; 
        } 
        $this->db->query($strSQL); 
        if ($this->db->next_record()) { 
            $this->id       = $this->db->f("id"); 
            $this->Name     = $this->db->f("Name"); 
            $this->Password = $this->db->f("Password");

return true; 
        } else { 
            return false; 
        } 
    }

/* 
    ** 函数功能:从数据库中删除记录 
    ** 参数说明:$id,记录编号 
    ** 返 回 值:true/false,成功/失败 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 10:47 
    */ 
    function delete($id = 0) { 
        if (is_array($id)) {    // 同时删除多条记录 
            foreach($id as $i) { 
                $strSQL = sprintf("DELETE FROM user WHERE id='%s'", $i); 
                $this->db->query($strSQL); 
            } 
            return true; 
        } else if ($id) { 
            $strSQL = sprintf("DELETE FROM user WHERE id='%s'", $id); 
        } else if ($this->id) { 
            $strSQL = sprintf("DELETE FROM user WHERE id='%s'", $this->id); 
        } else { 
            return false; 
        } 
        $this->db->query($strSQL); 
        return true; 
    }

/* 
    ** 函数功能:显示登陆界面 
    ** 参数说明:$placeholder,显示位置 
    ** 返 回 值:无 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 11:00 
    */ 
    function showLogin($placeholder) { 
        $this->tpl->addBlockfile($placeholder, "user_showLogin", 
                                 "tpl.user_showLogin.html" 
                                ); 
        $this->tpl->setCurrentBlock("user_showLogin"); 
        $this->tpl->setVariable(array("user_Logintitle" => "用户登陆", 
                                      "strUsername"     => "用户名", 
                                      "strPassword"     => "密 码" 
                                     ) 
                               ); 
        $this->tpl->parseCurrentBlock("user_showLogin"); 
    }

/* 
    ** 函数功能:处理登陆信息 
    ** 参数说明:$placeholder,显示位置 
    ** 返 回 值:true/false,成功/失败 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 11:12 
    */ 
    function getLogin($placeholder = "") { 
        if (isset($_POST["login"])) { 
            if ($_POST["username"] == "") { 
                if ($placeholder != "") { 
                    $this->tpl->setVarable($placeholder, "用户名不能为空!"); 
                } 
                return false; 
            } 
            $this->Name = $_POST["username"]; 
            $this->getfromdb(); 
            if ($this->Password() == $_POST["password"]) { 
                return true; 
            } 
        } else { 
            if ($placeholder != "") { 
                $this->tpl->setVarable($placeholder, "登陆失败!"); 
            } 
            return false; 
        } 
    }

/* 
    ** 函数功能:显示注册界面 
    ** 参数说明:$placeholder,显示位置 
    ** 返 回 值:无 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 13:33 
    */ 
    function showRegister($placeholder) { 
        $this->tpl->addBlockfile($placeholder, "user_showRegister", 
                                 "tpl.user_showRegister.html" 
                                ); 
        $this->setCurrentBlock("user_shoRegister"); 
        // 在这里完成处理模板的代码 
        ...

$this->parseCurrentBlock("user_shoRegister"); 
    }

/* 
    ** 函数功能:处理注册信息 
    ** 参数说明:$placeholder,显示位置 
    ** 返 回 值:true/false,注册成功/注册失败 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 15:49 
    */ 
    function getRegister($placeholder = "") { 
        if (isset($_POST["register")) { 
            if ($_POST["username"] == "") {    // 用户名合法性检查,可改成其它检查方式 
                if ($placeholder != "") { // 错误提示 
                    $this->tpl->setVariable($placeholder, "用户名不合法!"); 
                } 
                return false; 
            } 
            if ($_POST["password"] != $_POST["repassword"]) {    // 密码合法性检查 
                if ($placeholder != "") { // 错误提示 
                    $this->tpl->setVariable($placeholder, "两次输入密码不一致!"); 
                } 
                return false; 
            }

$strSQL = sprintf("SELECT COUNT(*) FROM user " 
                            . "WHERE Name='%s'", 
                              $this->Name 
                             ); 
            $this->db->query($strSQL); 
            $this->db->next_record(); 
            if ($this->db->f("COUNT(*)") > 0) { 
                return false; 
            } else { 
                $strSQL = sprintf("INSERT INTO user (Name, Password) " 
                                . "VALUES('%s', '%s')", 
                                  $this->Name, 
                                  $this->Password 
                                 ); 
                $this->db->query($strSQL); 
                return true; 
            } 
        } else { 
            return false; 
        } 
    } 
} // 类User定义结束

/* 
** 用途:用户系统数据列表抽象 
** 作者:岳信明 
** 时间:2005-8-30 17:21 
*/ 
class UserList { 
    var $page      = 0; 
    var $pages     = 0; 
    var $pagesize  = 9; 
    var $recordsum = 0; 
    var $Users     = array();

var $c; 
    var $db        = ""; 
    var $tpl       = "";

/* 
    ** 函数功能:构造函数,新建一个类时对一些变量进行初始化 
    ** 参数说明:无参数 
    ** 返 回 值:无 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-30 15:49 
    */ 
    function UserList($page = 1, $pagesize = 10, 
                      $c, $vtpl = "", $vdb = "") { 
        $this->page = $page; 
        $this->pagesize = $pagesize; 
        $this->condition = $condition; 
        if ($vdb != "") { 
            $this->db = $vdb; 
        } else { 
            global $db; 
            $this->db = $db; 
        } 
        if ($vtpl != "") { 
            $this->tpl = $vtpl; 
        } else { 
            $this->tpl = $tpl; 
        }

$strSQL = sprintf("SELECT COUNT(*) FROM user WHERE '%s'", 
                          $this->condition 
                         ); 
        $this->db->query($strSQL); 
        $this->db->next_record(); 
        $this->recordsum = $this->db->f("COUNT(*)");

$this->pages = ceil($this->recordsum / $this->pagesize);

$strSQL = sprintf("SELECT * FROM user WHERE '%s' LIMIT '%s', '%s'", 
                          $this->condition, 
                          $this->page * $this->pagesize, 
                          $this->pagesize + 1 
                         ); 
        $this->db->query($strSQL); 
        for ($i = 0; $this->db->next_record(); $i ++) { 
            $this->Users[$i] = new User($this->tpl, $this->db); 
            $this->Users[$i]->id       = $this->db->f("id"); 
            $this->Users[$i]->Name     = $this->db->f("Name"); 
            $this->Users[$i]->Password = $this->db->f("Password"); 
        } 
    }

/* 
    ** 函数功能:显示列表 
    ** 参数说明:$placeholder,显示位置 
    ** 返 回 值:无 
    ** 作  者:岳信明 
    ** 创建时间:2005-8-31 9:16 
    */ 
    function showUserList($placeholder) { 
        $this->tpl->addBlockfile($placeholder, "showUserList", "tpl.showUserList.html"); 
        $this->tpl->setCurrentBlock("showUserList"); 
        //在这里添加相应的处理代码 
        $this->tpl->setVariable("strTitle", "用户列表"); 
        $strTitles = array("用户名", "操作"); 
        $RecordOperations = array("重设密码" => "operate=passwd&id=", 
                                  "删除"     => "operate=delete&id=" 
                                 ); 
        // 显示表头 
        foreach ($strTitles as $title) { 
            $this->tpl->setCurrentBlock("showRecordsTitle"); 
            $this->tpl->setVariable("strHead", $title); 
            $this->tpl->parseCurrentBlock("showRecordsTitle"); 
        } 
        // 显示记录及相关操作 
        if (is_array($this->Users)) {    // 有记录 
            foreach ($this->Users as $user) { 
                $this->tpl->setCurrentBlock("showRecords"); 
                $this->tpl->setCurrentBlock("showCell"); 
                $this->tpl->setVariable("strCell", $user); 
                $this->tpl->parseCurrentBlock("showCell"); 
                $this->tpl->setCurrentBlock("showCell"); 
                foreach ($RecordOperations as $operation => $linkOperation) { 
                    $this->tpl->setCurrentBlock("showOperations"); 
                    $this->tpl->setVariable("strOperation", $operation); 
                    $this->tpl->setVariable("strLink", $_SERVER["REQUEST_URI"] . $linkOperation . $user->id); 
                    $this->tpl->parseCurrentBlock("showOperations"); 
                } 
                $this->tpl->parseCurrentBlock("showCell"); 
                $this->tpl->parseCurrentBlock("showRecords"); 
            } 
        } else {    // 无记录 
            $this->tpl->setCurrentBlock("showRecords"); 
            $this->tpl->setCurrentBlock("showCell"); 
            $this->tpl->setVariable("strCell", "无记录"); 
            $this->tpl->parseCurrentBlock("showCell"); 
            $this->tpl->setCurrentBlock("showCell"); 
            $this->tpl->setVariable("strCell", " "); 
            $this->tpl->parseCurrentBlock("showCell"); 
            $this->tpl->parseCurrentBlock("showRecords"); 
        } 
        $this->tpl->setCurrentBlock("showPageInfo"); 
        $this->tpl->setVariable(array("intColspan" => "2", 
                                      "intRecordSum" => $this->recordsum, 
                                      "intPage"      => $this->page, 
                                      "intPages"     => $this->pages 
                                     ) 
                               ); 
        $this->tpl->parseCurrentBlock("showPageInfo"); 
        $this->tpl->parseCurrentBlock("showUserList"); 
    } 

?> <!-- php buffer end -->

HTML 代码:

{strTitle}

{strHead}
{strCell}

{strOperation}

共 {intRecordSum} 条记录,{intPage}/{intPages} 页

{intPageNum}

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

(0)

相关推荐

  • 《Head First 设计模式》代码之PHP版(面向对象学习)第1/2页

    书中的例子都比较浅显易懂,不过由于是外国佬写的,所以例子的习惯不是很附合中国特色,可能偶尔看起来有些别扭,还有语言习惯也不是中国风.当然��看过这本书之后,你才能深刻理解设计模式到底能为你解决哪些问题,不能为你解决哪些问题(比如不能代替你的编码). 我将书中部分代码改成PHP,看下代码再配合概念应该是比较容易理解了. 策略模式 复制代码 代码如下: <?php /** * 策略模式 * 定义了算法族,分别封装起来,让它们之间可以互相替换, * 此模式让算法的变化独立于使用算法的客户. */ //

  • 学习php设计模式 php实现抽象工厂模式

    抽象工厂模式(Abstact Factory)是一种常见的软件设计模式.该模式为一个产品族提供了统一的创建接口.当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个具体的工厂类. 一.意图 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类[GOF95] 二.抽象工厂模式结构图 三.抽象工厂模式中主要角色 抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口.通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类.

  • php面向对象值单例模式

    单例模式(职责模式): 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 单例类: 1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化: 2.拥有一个保存类的实例的静态成员变量 3.拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化) 另外,需要创建__clone()方法防止对

  • PHP实现设计模式中的抽象工厂模式详解

    抽象工厂模式(Abstact Factory)是一种常见的软件设计模式.该模式为一个产品族提供了统一的创建接口.当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个 具体的工厂类. [意图] 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类[GOF95] [抽象工厂模式结构图] [抽象工厂模式中主要角色] 抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口.通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类

  • PHP面向对象程序设计之对象生成方法详解

    本文实例讲述了PHP面向对象程序设计之对象生成方法.分享给大家供大家参考,具体如下: 对象 看个例子 <?php abstract class Employee { // 雇员 protected $name; function __construct( $name ) { $this->name = $name; } abstract function fire(); } class Minion extends Employee { // 奴隶 继承 雇员 function fire()

  • PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式

    毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 单例模式 当需要保证某个对象只能有一个实例的时候,单例模式非常有用.它把创建对象的控制权委托到一个单一的点上,任何时候应用程序都只会仅有一个实例存在.单例类不应该可以在类的外部进行实例化一个单例类应该具备以下几个要素. 必须拥有一个访问级别为 private 的构造函数,有效防止类被随意实例化. 必须拥有一个保存类的实例的静态变量. 必须拥有一个访问这个实例的公共的静态

  • php单例模式实现(对象只被创建一次)

    单例类至少拥有以下三种公共元素: 必须拥有一个构造函数,并且必须被标记为private.    拥有一个保存类的实例的静态成员变量.    拥有一个访问这个实例的公共的静态方法 具体使用方面,我在下面php实例中注释的很清楚: 复制代码 代码如下: <?php /**  * by www.phpddt.com  */ class Mysql{  //该属性用来保存实例  private static $conn;  //构造函数为private,防止创建对象  private function

  • PHP实现单例模式最安全的做法

    作为一种常用的设计模式,单例模式被广泛的使用.那么如何设计一个单例才是最好的呢? 通常我们会这么写,网上能搜到的例子也大部分是这样: 复制代码 代码如下: class A{    protected static $_instance = null;    protected function __construct()    {        //disallow new instance    }    protected function __clone(){        //disal

  • 初次接触php抽象工厂模式(Elgg)

    想实现这样一个功能:开展一个网站邀请活动,然后参与者(owner)将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,owner的邀请日志记录条数加1. 活动类 Activity 复制代码 代码如下: class Activity extends ElggEntity { private $strategy; //用于保存策略实例 public function __construction($guid) { ... $this->load($guid); //载入实体 } public

  • PHP面向对象程序设计组合模式与装饰模式详解

    本文实例讲述了PHP面向对象程序设计组合模式与装饰模式.分享给大家供大家参考,具体如下: 组合模式 定义:组合模式定义了一个单根继承体系,使具有截然不同职责的集合可以并肩工作. 一个军队的案例, <?php abstract class Unit { // 个体 abstract function bombardStrength(); } class Archer extends Unit { // 弓箭手 function bombardStrength() { return 4; } } c

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

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

  • PHP面向对象学习笔记之二 生成对象的设计模式

    一. 单例模式(Singleton) 如果应用程序每次包含且仅包含一个对象,那么这个对象就是一单例. 用来替代全局变量. 复制代码 代码如下: <?php require_once("DB.php"); class DatabaseConnection{ <STRONG><SPAN style="COLOR: #ff0000">public static function get()</SPAN></STRONG>

随机推荐