創(chuàng)造世界上最簡(jiǎn)單的 PHP 開發(fā)模式
更新時(shí)間:2006年12月04日 00:00:00 投稿:mdxy-dxy
這篇文章主要介紹了創(chuàng)造世界上最簡(jiǎn)單的 PHP 開發(fā)模式
, 5);
$data[asphotlist] = getArticleList(2, "clicks DESC, id DESC", 1, 3);
dbDisconnect();
renderTpl(’list2.htm’, $data);
?>
--------view.htm--------------
<!-- BEGIN content -->
編號(hào):{id}<br>標(biāo)題:{title}<br>內(nèi)容:{content}
<!-- END content -->
--------view.php------------------
<?php
require_once "config.inc.php";
dbConnect();
$data = array();
$data[content] = getArticle((int)$_GET[id]);
dbDisconnect();
renderTpl(’view.htm’, $data);
?>
八:文章添加實(shí)現(xiàn)和模板處理(萬里長(zhǎng)征的再來一步)
---------------new.htm-----------
<form action="add.php" method="post">
標(biāo)題:<input type="text" size="20"><br>
內(nèi)容:<textarea cols="50" rows="4"></textarea><br>
<input type="submit" value="提交">
</form>
---------------new.php------------
<?php
require_once "config.inc.php";
renderTpl(’new.htm’, array());
?>
---------------CoreUtil.php--------------
<?php
function doPostVar(&$data){
$keys = array_keys($data);
foreach($keys as $key){
$data[$key] = addslashes(htmlspecialchars(trim($data[$key])));
if($data[$key]==null) $data[$key] = "$key default";
}
}
?>
---------------add.htm------------
<!-- BEGIN success -->
{content}
<!-- END success -->
---------------add.php------------
<?php
require_once "config.inc.php";
dbConnect();
$data = action();
doPostVar($data);
addArticle($data);
$result[success][content] = "文章添加成功";
dbDisconnect();
renderTpl(’add.htm’, $result);
function action(){
$data = array();
$data[title] = $_POST[title];
$data[content] = $_POST[content];
$data[datetime] = date(’Y-m-d H:i:s’);
$data[pid] = 1;
return $data;
}
?>
這樣一個(gè)最最簡(jiǎn)單的文章的發(fā)布系統(tǒng)就完成了,不知道對(duì)您有什么收獲沒有。
九、總結(jié)
程序?qū)懲炅?,大家來總結(jié)一下吧,看看實(shí)現(xiàn)過程,應(yīng)該可以說是簡(jiǎn)單明了吧。
1、統(tǒng)一實(shí)現(xiàn)數(shù)據(jù)庫(kù)訪問接口。更改后臺(tái)數(shù)據(jù)庫(kù)結(jié)構(gòu)的時(shí)候,只要簡(jiǎn)單的修改相應(yīng)的接口函數(shù),其他部分的php代碼根本就不用理會(huì)。
2、整個(gè)系統(tǒng)php代碼和html代碼分開管理,php代碼前臺(tái)實(shí)現(xiàn)起來也很簡(jiǎn)單,你也應(yīng)該已經(jīng)可以發(fā)現(xiàn)了,基本上是在10行代碼左右。
3、可以任意的擴(kuò)充功能。用函數(shù)對(duì)新的功能進(jìn)行包裝后,在具體的前臺(tái)的查詢顯示頁(yè)面中只有加入對(duì)相應(yīng)的函數(shù)的簡(jiǎn)單的調(diào)用就可以了,一行代碼就搞定了。
4、代碼復(fù)用。通過對(duì)功能的包裝,減少了大量的不必要的重復(fù)代碼工作,效率應(yīng)該是提高了很多吧?
5、可以移植性。如果將來做其他的網(wǎng)站,要是遇到了和這個(gè)項(xiàng)目相同的實(shí)現(xiàn)功能,你可以怎么做呢?把這里的函數(shù)和數(shù)據(jù)庫(kù)結(jié)構(gòu)copy過去,修改一下新項(xiàng)目的模板,是不是就可一完成這個(gè)新的項(xiàng)目了呢?根本就不用考慮修改php代碼。
6、結(jié)構(gòu)代碼清晰。別人可以輕易的和你共同開發(fā)一個(gè)項(xiàng)目,代碼沖突也會(huì)減少至最低。
當(dāng)然實(shí)際工作中遇到的情況可能比這個(gè)例子復(fù)雜的多,但是再?gòu)?fù)雜的任務(wù)都是可以拆分的。
十、后言
不知道大家有沒有學(xué)過jsp和servlet這樣的東西,他們有很多優(yōu)秀的設(shè)計(jì)思路,值得我們?nèi)パ芯亢蚦opy(說句實(shí)在話,有時(shí)間的都應(yīng)該去接觸一下java,不是為了學(xué)習(xí)這門語言而學(xué)習(xí),是要學(xué)習(xí)他的設(shè)計(jì)模式和優(yōu)秀的功能實(shí)現(xiàn)方式)。jsp至少有兩樣?xùn)|西對(duì)我們很有用,action和filter。
action是主要是處理一些事件邏輯,就像add.php中我們定義的action()函數(shù)一樣,用來驗(yàn)證和獲取表單提交上來的數(shù)據(jù)。當(dāng)然這樣寫的代碼量和你以前方法的代碼量是一樣的,好像沒有什么區(qū)別,但是它實(shí)現(xiàn)了代碼的分離,結(jié)構(gòu)是不是比你以前的方法清晰很多呢?
filter是一個(gè)過濾功能,用來過濾和重新定向網(wǎng)絡(luò)的訪問,對(duì)一些非法的請(qǐng)求和錯(cuò)誤的請(qǐng)求進(jìn)行重新的定向。讓我們來通過一個(gè)后臺(tái)管理的程序來看看他具體的作用。
將下面的這個(gè)函數(shù)copy到你的CoreUtil.php里面,這個(gè)函數(shù)是一個(gè)后臺(tái)管理登陸的過濾函數(shù),一個(gè)是不在本地緩存web頁(yè)面的函數(shù):
function windowNoCache($cache){
if(!$cache || headers_sent()) return ;
header(’Expires: ’.date(’D,d M Y H:i:s’,mktime(0,0,0,1,1,2000)).’ GMT’);
header(’Last-Modified:’.gmdate(’D,d M Y H:i:s’).’ GMT’);
header(’Cache-control: private, no-cache,must-revalidate’);
header(’Pragma: no-cache’);
}
function isAdminLogin(){
if($_SESSION[relogin]=="ok") return;
if($_SESSION[adminuser]!=SYS_ADMIN_NAME){
$_SESSION[relogin] = "ok";
die("<script language=\"javascript\"> top.location=’adminlogin.php’; </script>");
}
$_SESSION[relogin] = "no";
}
然后在 根目錄 底下加上如下的文件
------------adminconfig.inc.php------------
<?php
define(’SYS_ADMIN_NAME’, ’hello’); //后臺(tái)管理登陸名
define(’SYS_ADMIN_PASSWORD’, ’hello’); //后臺(tái)管理登陸密碼
include ’config.inc.php’;
windowNoCache(true);
isAdminLogin();
?>
------------adminindex.php----------------
<?php
require_once "adminconfig.inc.php";
renderTpl(’adminindex.htm’, array());
?>
------------adminlogin.php------------------
<?php
include "adminconfig.inc.php";
if($_POST[name]==SYS_ADMIN_NAME && $_POST[code]==SYS_ADMIN_PASSWORD){
$_SESSION[adminuser] = SYS_ADMIN_NAME;
header("location: adminindex.php");
}else{
renderTpl(’adminlogin.htm’, array());
}
?>
在 smart/template 目錄下面加上如下的文件
------------adminlogin.htm------------------
<form name="form1" method="post" action="">
<input type="text" name="name" size="20" value="">
<input type="password" name="code" size="20" value="">
<input type="submit" name="Submit" value=" 登 陸 ">
</form>
------------adminindex.htm----------------
<h2>您好歡迎登陸后臺(tái)管理</h2>
現(xiàn)在訪問adminindex.php看看會(huì)發(fā)生什么事情,然后用adminconfig.inc.php里面設(shè)定的用戶名密碼登陸。這種功能在web的很多地方都可以派上用場(chǎng),應(yīng)該是一個(gè)好的方法吧。其他的后臺(tái)訪問的頁(yè)面只要也都加載了adminconfig.inc.php ,就不用再考慮后臺(tái)訪問權(quán)限的問題了。
十一 附錄
簡(jiǎn)單的隱藏文件的擴(kuò)展名,搞暈瀏覽者,讓他不知道你是用什么語言編的程序。
就以list1.php為例子吧,
1、我們修改list1.php的名稱為list1.tmp
2、進(jìn)入命令行窗口(dos窗口),在web的目錄下面建立一個(gè)文件,文件名是“.htaccess”。
3、編輯“.htaccess”文件,輸入以下的內(nèi)容
AddType application/x-httpd-php .tmp
通過瀏覽器訪問list1.tmp,看看是不是ok了。
$data[asphotlist] = getArticleList(2, "clicks DESC, id DESC", 1, 3);
dbDisconnect();
renderTpl(’list2.htm’, $data);
?>
--------view.htm--------------
<!-- BEGIN content -->
編號(hào):{id}<br>標(biāo)題:{title}<br>內(nèi)容:{content}
<!-- END content -->
--------view.php------------------
<?php
require_once "config.inc.php";
dbConnect();
$data = array();
$data[content] = getArticle((int)$_GET[id]);
dbDisconnect();
renderTpl(’view.htm’, $data);
?>
八:文章添加實(shí)現(xiàn)和模板處理(萬里長(zhǎng)征的再來一步)
---------------new.htm-----------
<form action="add.php" method="post">
標(biāo)題:<input type="text" size="20"><br>
內(nèi)容:<textarea cols="50" rows="4"></textarea><br>
<input type="submit" value="提交">
</form>
---------------new.php------------
<?php
require_once "config.inc.php";
renderTpl(’new.htm’, array());
?>
---------------CoreUtil.php--------------
<?php
function doPostVar(&$data){
$keys = array_keys($data);
foreach($keys as $key){
$data[$key] = addslashes(htmlspecialchars(trim($data[$key])));
if($data[$key]==null) $data[$key] = "$key default";
}
}
?>
---------------add.htm------------
<!-- BEGIN success -->
{content}
<!-- END success -->
---------------add.php------------
<?php
require_once "config.inc.php";
dbConnect();
$data = action();
doPostVar($data);
addArticle($data);
$result[success][content] = "文章添加成功";
dbDisconnect();
renderTpl(’add.htm’, $result);
function action(){
$data = array();
$data[title] = $_POST[title];
$data[content] = $_POST[content];
$data[datetime] = date(’Y-m-d H:i:s’);
$data[pid] = 1;
return $data;
}
?>
這樣一個(gè)最最簡(jiǎn)單的文章的發(fā)布系統(tǒng)就完成了,不知道對(duì)您有什么收獲沒有。
九、總結(jié)
程序?qū)懲炅?,大家來總結(jié)一下吧,看看實(shí)現(xiàn)過程,應(yīng)該可以說是簡(jiǎn)單明了吧。
1、統(tǒng)一實(shí)現(xiàn)數(shù)據(jù)庫(kù)訪問接口。更改后臺(tái)數(shù)據(jù)庫(kù)結(jié)構(gòu)的時(shí)候,只要簡(jiǎn)單的修改相應(yīng)的接口函數(shù),其他部分的php代碼根本就不用理會(huì)。
2、整個(gè)系統(tǒng)php代碼和html代碼分開管理,php代碼前臺(tái)實(shí)現(xiàn)起來也很簡(jiǎn)單,你也應(yīng)該已經(jīng)可以發(fā)現(xiàn)了,基本上是在10行代碼左右。
3、可以任意的擴(kuò)充功能。用函數(shù)對(duì)新的功能進(jìn)行包裝后,在具體的前臺(tái)的查詢顯示頁(yè)面中只有加入對(duì)相應(yīng)的函數(shù)的簡(jiǎn)單的調(diào)用就可以了,一行代碼就搞定了。
4、代碼復(fù)用。通過對(duì)功能的包裝,減少了大量的不必要的重復(fù)代碼工作,效率應(yīng)該是提高了很多吧?
5、可以移植性。如果將來做其他的網(wǎng)站,要是遇到了和這個(gè)項(xiàng)目相同的實(shí)現(xiàn)功能,你可以怎么做呢?把這里的函數(shù)和數(shù)據(jù)庫(kù)結(jié)構(gòu)copy過去,修改一下新項(xiàng)目的模板,是不是就可一完成這個(gè)新的項(xiàng)目了呢?根本就不用考慮修改php代碼。
6、結(jié)構(gòu)代碼清晰。別人可以輕易的和你共同開發(fā)一個(gè)項(xiàng)目,代碼沖突也會(huì)減少至最低。
當(dāng)然實(shí)際工作中遇到的情況可能比這個(gè)例子復(fù)雜的多,但是再?gòu)?fù)雜的任務(wù)都是可以拆分的。
十、后言
不知道大家有沒有學(xué)過jsp和servlet這樣的東西,他們有很多優(yōu)秀的設(shè)計(jì)思路,值得我們?nèi)パ芯亢蚦opy(說句實(shí)在話,有時(shí)間的都應(yīng)該去接觸一下java,不是為了學(xué)習(xí)這門語言而學(xué)習(xí),是要學(xué)習(xí)他的設(shè)計(jì)模式和優(yōu)秀的功能實(shí)現(xiàn)方式)。jsp至少有兩樣?xùn)|西對(duì)我們很有用,action和filter。
action是主要是處理一些事件邏輯,就像add.php中我們定義的action()函數(shù)一樣,用來驗(yàn)證和獲取表單提交上來的數(shù)據(jù)。當(dāng)然這樣寫的代碼量和你以前方法的代碼量是一樣的,好像沒有什么區(qū)別,但是它實(shí)現(xiàn)了代碼的分離,結(jié)構(gòu)是不是比你以前的方法清晰很多呢?
filter是一個(gè)過濾功能,用來過濾和重新定向網(wǎng)絡(luò)的訪問,對(duì)一些非法的請(qǐng)求和錯(cuò)誤的請(qǐng)求進(jìn)行重新的定向。讓我們來通過一個(gè)后臺(tái)管理的程序來看看他具體的作用。
將下面的這個(gè)函數(shù)copy到你的CoreUtil.php里面,這個(gè)函數(shù)是一個(gè)后臺(tái)管理登陸的過濾函數(shù),一個(gè)是不在本地緩存web頁(yè)面的函數(shù):
function windowNoCache($cache){
if(!$cache || headers_sent()) return ;
header(’Expires: ’.date(’D,d M Y H:i:s’,mktime(0,0,0,1,1,2000)).’ GMT’);
header(’Last-Modified:’.gmdate(’D,d M Y H:i:s’).’ GMT’);
header(’Cache-control: private, no-cache,must-revalidate’);
header(’Pragma: no-cache’);
}
function isAdminLogin(){
if($_SESSION[relogin]=="ok") return;
if($_SESSION[adminuser]!=SYS_ADMIN_NAME){
$_SESSION[relogin] = "ok";
die("<script language=\"javascript\"> top.location=’adminlogin.php’; </script>");
}
$_SESSION[relogin] = "no";
}
然后在 根目錄 底下加上如下的文件
------------adminconfig.inc.php------------
<?php
define(’SYS_ADMIN_NAME’, ’hello’); //后臺(tái)管理登陸名
define(’SYS_ADMIN_PASSWORD’, ’hello’); //后臺(tái)管理登陸密碼
include ’config.inc.php’;
windowNoCache(true);
isAdminLogin();
?>
------------adminindex.php----------------
<?php
require_once "adminconfig.inc.php";
renderTpl(’adminindex.htm’, array());
?>
------------adminlogin.php------------------
<?php
include "adminconfig.inc.php";
if($_POST[name]==SYS_ADMIN_NAME && $_POST[code]==SYS_ADMIN_PASSWORD){
$_SESSION[adminuser] = SYS_ADMIN_NAME;
header("location: adminindex.php");
}else{
renderTpl(’adminlogin.htm’, array());
}
?>
在 smart/template 目錄下面加上如下的文件
------------adminlogin.htm------------------
<form name="form1" method="post" action="">
<input type="text" name="name" size="20" value="">
<input type="password" name="code" size="20" value="">
<input type="submit" name="Submit" value=" 登 陸 ">
</form>
------------adminindex.htm----------------
<h2>您好歡迎登陸后臺(tái)管理</h2>
現(xiàn)在訪問adminindex.php看看會(huì)發(fā)生什么事情,然后用adminconfig.inc.php里面設(shè)定的用戶名密碼登陸。這種功能在web的很多地方都可以派上用場(chǎng),應(yīng)該是一個(gè)好的方法吧。其他的后臺(tái)訪問的頁(yè)面只要也都加載了adminconfig.inc.php ,就不用再考慮后臺(tái)訪問權(quán)限的問題了。
十一 附錄
簡(jiǎn)單的隱藏文件的擴(kuò)展名,搞暈瀏覽者,讓他不知道你是用什么語言編的程序。
就以list1.php為例子吧,
1、我們修改list1.php的名稱為list1.tmp
2、進(jìn)入命令行窗口(dos窗口),在web的目錄下面建立一個(gè)文件,文件名是“.htaccess”。
3、編輯“.htaccess”文件,輸入以下的內(nèi)容
AddType application/x-httpd-php .tmp
通過瀏覽器訪問list1.tmp,看看是不是ok了。
相關(guān)文章
PHP5與MySQL數(shù)據(jù)庫(kù)操作常用代碼 收集
php最近比較熱門,所以學(xué)習(xí)php的朋友也越來越多,這里整理下數(shù)據(jù)庫(kù)的一些操作,需要的朋友可以參考下。2010-03-03php面向?qū)ο笕ヂ?(六)__set() __get() __isset() __unset()的用法
一般來說,總是把類的屬性定義為private,這更符合現(xiàn)實(shí)的邏輯。但是,對(duì)屬性的讀取和賦值操作是非常頻繁的,因此在PHP5 中,預(yù)定義了兩個(gè)函數(shù)“__get()”和“__set()”來獲取和賦值其屬性,以及檢查屬性的“__isset()”和刪除屬性的方法“__unset()”。2009-09-09PHP文件注釋標(biāo)記及規(guī)范小結(jié)
PHP文件注釋標(biāo)記及規(guī)范小結(jié),php開發(fā)的朋友可以收藏下,方便以后使用,讓我們的代碼更專業(yè)2012-04-04PHP實(shí)現(xiàn)分頁(yè)的一個(gè)示例
PHP實(shí)現(xiàn)分頁(yè)的一個(gè)示例...2006-10-10