文字推广: 传奇世界私服 传世私服
网站首页 Linux博客  Linux网址导航  Linux下载  Linux群集  Linux搜索  网站地图
 
 14 12
发新话题
打印

面向对象的PHP开发模式(简写版)

面向对象的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]<?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 -->[/php]
HTML 代码:
[runcode]<!-- 文件名:tpl.showUserList.html -->
<!-- 功 能:显示列表 -->
{strTitle}
<table width="100%"  cellSpacing="0" cellPadding="8" border="1">
        <tr bgcolor="#dfe0bb">
                <!-- BEGIN showRecordsTitle -->
                <td align="center">{strHead}</td>
                <!-- END showRecordsTitle -->
        </tr>
        <!-- BEGIN showRecords -->
        <tr>
                <!-- BEGIN showCell -->
                <td>
                        {strCell}
                        <!-- BEGIN showOperations -->
                        <a href="{strLink}" {is_newWindow}>{strOperation}</a>
                        <!-- END showOperations -->
                </td>
                <!-- END showCell -->
        </tr>
        <!-- END showRecords -->
        <!-- BEGIN showPageInfo -->
        <tr>
                <td colspan="intColspan">
                        共 {intRecordSum} 条记录,{intPage}/{intPages} 页
                        <!-- BEGIN showPageNum -->
                        <a href="{strLink}>{intPageNum}</a>
                        <!-- END showPageNum -->
                </td>
        </tr>
        <!-- END showPageInfo -->
</table>[/runcode]
加入Linux大本营管理团队,共创美好家园!有意者请 mailto: webmaster@linuxdby.com

TOP

第十楼也不错哦 十楼也不错哦!

提示: 作者被禁止或删除 内容自动屏蔽

TOP

来这样好的地方

美国宾州州立大学食物营养学教授芭芭拉·罗尔斯说,早餐时段“是不费力便可以进补的最佳时段”,相信早餐的重要性,大家已经了解得越来越多了感谢写了这么好的文章给需要店面装修的朋友空调维修带来了福音
优秀的装饰公司

TOP

无线网桥

提示: 作者被禁止或删除 内容自动屏蔽

TOP

北京卓尔达免费网络电话公司8

高质量网络电话的使用方法与目前的200、免费网络电300电话卡相似费网络电话,即用户购买了高质量网络电话卡后,就可得到一个私人账号和密码,使用时,在任何一部双音频电话上拨打该公司的IP接入号码,然后根据语音提示,输入私人账号及密码,再拨人被叫号码即可。
…总之,高质量网络电话是技术进步的产物,免费网络电话它在目前通信领域中极具发展潜力。免费网络电话相信随着技术的更新的市场的规范,它的前景会越来越好

TOP

成都NSK轴承 成都NSK进口轴承 成都轴承

提示: 作者被禁止或删除 内容自动屏蔽

TOP

堕到地上的眼泪

提示: 作者被禁止或删除 内容自动屏蔽

TOP

北京到安卡拉机票

提示: 作者被禁止或删除 内容自动屏蔽

TOP

水上滚筒水上步行球派宁清洁机丽妍堂诸葛马

提示: 作者被禁止或删除 内容自动屏蔽

TOP

丽妍堂水宜生派宁水上步行球水上滚筒诸葛马手摇船

提示: 作者被禁止或删除 内容自动屏蔽

TOP

 14 12
发新话题
本功能由奇虎搜索实现

相关主题

标题 作者 最后发表
[站外] 建立灵巧结构的PHP程序   [转帖] implus 2008-09-03
[站外] Oracle 和 PHP 使用入门   [转帖] creditcard 2008-09-03
[站外] 无知是福   [转帖] 彩虹 2008-09-03
[站外] 美女佣兵团,不看后悔一辈子   [转帖] sr802820 2008-09-02
[站外] InfoWorld2008最佳开源软件大奖   [转帖] 博客园新闻频道 2008-09-02
点击阅读更多关于的相关帖子  更多相关主题