不錯的一篇物件導向的PHP開發模式(簡寫版)

來源:互聯網
上載者:User

我看到有人在批判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 程式碼: <!-- 檔案名稱:tpl.showUserList.html --><!-- 功 能:顯示列表 -->
{strTitle}





{strHead}
{strCell}

{strOperation}
共 {intRecordSum} 條記錄,{intPage}/{intPages} 頁

[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.