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 代码:

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");

}

}

?> 

HTML 代码:

{strTitle} {strHead}

共 {intRecordSum} 条记录,{intPage}/{intPages} 页 [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]

相关文章

1a1b05c64693fbf380aa1344a7812747.png

当每个会员登录进来,在查询数据库的情况下生成一组数字或者是数字与字母组合不重复的会员卡号,接下来,给大家演示一个小程序,基于php实现生成唯一会员卡号,有需要的朋友一起来学习吧2015-08-08

4f55910a645b073bc4fc65dc10dc14bd.png

这篇文章主要介绍了php实现的简单美国商品税计算函数,涉及php数学计算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下2015-07-07

0ea3c7666119d5615e582f823fb3fad6.png

这篇文章主要介绍了php操作redis常见方法,结合实例形式分析了PHP针对Redis key与value的各种常见操作技巧,需要的朋友可以参考下2020-04-04

4f96a78db829b1556ff16de21e013c7a.png

通过上一篇,获取用户Ip地址通用方法常见安全隐患(HTTP_X_FORWARDED_FOR) ,我们已经意 识到直接从http_x_forwarded_for中读取用户IP,跟我们直接从一个get,post值中读取其实没有两样。web参数检测里面一个基本原则:“一切输入都是有害的”,因此,只要是输入我们就需要进行过滤2013-06-06

8cc1031babc6aff2319f1c6af8544aa0.png

在本篇文章里小编给大家整理了关于phpfpm的作用和用法相关知识点,有需要的朋友们学习下。2019-10-10

0c932a99bb7b6f23c937db507070cc7b.png

这篇文章主要介绍了php实现httpRequest的方法,涉及php操作http的技巧,具有一定参考借鉴价值,需要的朋友可以参考下2015-03-03

cca732bf65a93ed2ec0ac80c638460fe.png

Gregarius支持中文的程度很不错,唯一的缺陷就是在日期格式上会出现乱码。其实只要修改根目录下util.php文件的rss_locale_date方法就可以解决这个问题,希望可以帮助使用Gregarius的朋友,修改后的方法代码如下:2008-04-04

2d9f31f2af7b675a3d153d2b7f1035a7.png

二分查找又称折半查找,它是一种效率较高的查找方法。2011-06-06

b452cee8ec5cd9e58ab98eba17281e59.png

以前从来没写过递归(其实想想,对算法完全没概念),刚好有这个需求,试着写了一下,发现也挺容易的,特别记录一下。2014-05-05

f4838ec7e2d4da28e0b57d4e852dadd4.png

这篇文章主要介绍了php生成zip文件类,实例分析了php操作zip文件的技巧,非常具有实用价值,需要的朋友可以参考下2015-04-04

最新评论

©CopyRight 2006-2020 JB51.Net Inc All Rights Reserved. 脚本之家 版权所有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值