LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5966|回复: 24

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

[复制链接]
发表于 2005-8-30 16:12:34 | 显示全部楼层 |阅读模式
我看到有人在批判PHP,什么这地方不好用,那地方不好用的。其实严格地说起来,没有一门语言好用,也没有一门语言有一个严格的标准,凡事都有一个发展的过程,我们总不能等这些标准呀什么的都很完善了再用吧?我觉得不管用什么语言,写程序都要靠自己,一个程序员要有好的风格,思路等等。最近我在整理一些资料,现在发出一些,希望大家多提意见,多多扶持啊哈

如有转贴,这是原文地址,请在这里回复http://www.linuxsir.cn/bbs/showthread.php?t=216563

======================================
面向对象的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->assword,
                                          $this->id
                                         );
                } else {
                        $strSQL = sprintf("INSERT user (Name, Password) "
                                        . "VALUES ('%s', '%s')",
                                          $this->Name,
                                          $this->assword
                                         );
                }
                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->assword = $this->db->f("assword");

                        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->assword() == $_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->assword
                                                 );
                                $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 $condition = "";
        var $db        = "";
        var $tpl       = "";

        /*
        ** 函数功能:构造函数,新建一个类时对一些变量进行初始化
        ** 参数说明:无参数
        ** 返 回 值:无
        ** 作  者:岳信明
        ** 创建时间:2005-8-30 15:49
        */
        function UserList($page = 1, $pagesize = 10,
                          $condition = "1", $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]->assword = $this->db->f("assword");
                }
        }


        /*
        ** 函数功能:显示列表
        ** 参数说明:$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", "&nbsp;");
                        $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]
[HTML]
<!-- 文件名: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>
[/HTML]

附件是个简易的程序生成工具,javescript写的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2005-8-30 16:23:20 | 显示全部楼层
===========================
程序员程序风格约定(修订版)
===========================

程序风格即程序代码书写的风格。良好程序风格的特点是使代码易读。总结程序设计
实践中的经验,程序风格的要素包括以下几点:

一、名字的使用
  1. 变量名,变量名要以变量的类型缩写开头,尽量以能代表变量意义的英语缩写。如
[PHP]
var $strName = "";
var $strPassword = "";
var $intAge = 20;[/PHP]
  2. 函数名,尽量以能代表变量意义的英语缩写。如
[PHP]
function getPassword() {
        ...

        return $strPassword;
}[/PHP]
二、表达式与语句>>>
  1. 运算符前后有一空格
[PHP]
$i = 0;
$a = $b + $c;[/PHP]  
  2. "{}"的使用
[PHP]
if(...) {
        ...
}
while() {
        ...
}[/PHP]
 3. html注意
  尽量符合xml标准,使标签成对,以使将来对文件易于处理。对于单独使用的标签,就写成如下形式。
        <br> => <br />

三、程序中的常量>>>
  用语言规定的语法对常量进行定义,常量的取名用大写,如:
[PHP]
define("CONSTANT", "Hello world.");
echo CONSTANT;[/PHP]

四、注释的使用>>>
  1. 每个文件应在开头加注释,说明这个文件的用途,创建者,创建时间
[PHP]
/*
** 用途:...
** 创建者:...
** 创建时间:xxxx-xx-xx
** $Id$(进行CVS提交操作时会记录更新时间及操作用户等,详见CVS操作)
*/[/PHP]

  2. 函数功能说明
[PHP]
/*
** 函数功能:...
** 参数说明:...
** 返 回 值:...
** 作  者:...
** 创建时间:...
*/[/PHP]

  3. 变量或单行语句注释
                当需要对一个变量或单行语句进行注释时,按如下方式进行
[PHP]
var $var;  //这是对变量的注释
echo  $var;  //这是对单行语句的注释[/PHP]

  4. 语句段落的注释
                当某一段落的语句完成特定的功能时,前后就加一空行,
                并在段落前进行注释,注释的缩进与第一行程序对齐,如:

[PHP]
// 对某一程序语句段落的注释
// 对某一程序语句段落的注释
....

或者

/*
** 对某一程序语句段落的注释
** 对某一程序语句段落的注释
*/[/PHP]


五、缩进>>>
  缩进一个“\t”(按键盘Tab键)为一个单位,不能用半角或者全角空格(程序员可以
根据自己的习惯定义和个"\t"显示为2个或者4个半角空格)。如下所示:
[PHP]
if(...) {
        ...
}

while(...) {
        ...
}

function fun(...) {
        ...
}[/PHP]

六、程序布局>>>
  1. 每一行语句(包括注释)不能超过80个字符的宽度,以免为程序阅读带来麻烦。
  2. 变量的声明与执行语句间应加一空行,如下所示:
[PHP]
function func($strA, $intB=0) {
        $intC = 10;

        for($i = 0; $i < $intC; $i ++) {
                echo $strA . "<br>";
        }

        ...
}[/PHP]
                3. 在编辑器(推荐使用ultraEdit)中设置每次存盘删除尾部空格,减少程序中的多余
字符。

七、其实补充说明
  1. SQL语句关键字要大写,不能直接将SQL语句写与数据库接口函数,先将SQL语句作为
一个字符串赋值给一个变量(如:$strSQL);html语句全部小写,标签元素属性值一定要
有引号(双引号)。

八、程序开发样例
===================================================
——岳信明 2005-8-18 10:39
——张伟        修改于 2005-8-18 11:10
——岳信明 修改于2005-8-18 11:30
回复 支持 反对

使用道具 举报

发表于 2005-8-30 17:17:43 | 显示全部楼层
我感觉用UML把系统描述清楚是面向对象编程的关键
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-30 21:57:07 | 显示全部楼层
呵呵,这年头,会PHP的不懂甚至不知道UML的人大有人在。
回复 支持 反对

使用道具 举报

发表于 2005-9-1 00:19:56 | 显示全部楼层
9494,
学三天接生意
接了生意天天在论坛跪求,打滚求, .....高手解决的也大有人在
后面还不忘一句急要,明天要验收.....
给他看一下,不是html不会,就是最基础的javascript不懂,
急要就搜啊,给他回一个,
他就来,不明白,给个代码怎么样
------------------------------------------------------------------
oo跟速度之间还要找一个平衡点
同一个功能,直接写跟用函数,后者会慢很多
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-1 09:41:57 | 显示全部楼层
Post by phphp
9494,
学三天接生意
接了生意天天在论坛跪求,打滚求, .....高手解决的也大有人在
后面还不忘一句急要,明天要验收.....
给他看一下,不是html不会,就是最基础的javascript不懂,
急要就搜啊,给他回一个,
他就来,不明白,给个代码怎么样
------------------------------------------------------------------
oo跟速度之间还要找一个平衡点
同一个功能,直接写跟用函数,后者会慢很多



呵呵,直接写跟用函数,后者会慢很多,写类进行数据抽象呢?会更慢!有句话说的好,“磨刀不误砍柴功”,何况我们现在还不是在磨刀,我们不能仅仅考虑当时的痛快,把事情快速做完,然后交出去就不管了,后期得维护啊。要不就是极度的不负责任。
回复 支持 反对

使用道具 举报

发表于 2005-9-1 18:27:42 | 显示全部楼层
估计PHPHP说的是运行速度,而不是开发速度。开发速度的话,用OO和用直接用PHP语句的开发速度如果是大项目的话,可能还是OO快。
回复 支持 反对

使用道具 举报

发表于 2005-9-2 10:55:36 | 显示全部楼层
建议php下的OOP开发全部maintain到v5下,why?
最主要是runtime的速度.......


LZ的是v4下的OOP,不过也可以了,反正不会犯错.......
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-8 22:35:50 | 显示全部楼层
PHP5是很好,我也很喜欢,可是它和PHP4是不兼容的,很多情况下不容易升级,当然两个现时配上也行,开发时所有PHP5的程序都以“*.php5”命名好了,呵呵。
回复 支持 反对

使用道具 举报

发表于 2005-9-9 15:49:27 | 显示全部楼层
Post by mikkoyue
PHP5是很好,我也很喜欢,可是它和PHP4是不兼容的,很多情况下不容易升级,当然两个现时配上也行,开发时所有PHP5的程序都以“*.php5”命名好了,呵呵。


基本是兼容的,你的代码在5上也能很好运行
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表