我看到有人在批判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 代碼:
[Ctrl+A 全選 注:如需引入外部Js需刷新才能執行]