关 键 词:
程序 编程 模板 this // app function var 显示 CPage
Application类还继承了PhpClass类。PhpClass类里面是些什么东些呢?在我所有的类库中,基本上每个类中都要用到一些相同的方法与属性,比如错处理catchErr()等,将它们封装起来,作为所有类的祖类。
PhpClass的完整代码如下:
PhpClass.inc.php
CODE:
<?php
if(!defined("__CLASS_PHPCLASS__"))
{
define("__CLASS_PHPCLASS__",1);
class PhpClass{
var $debug = false; //是否显示调式信息
var $debugMsg = ''; //记录调式信息
var $errMsg = ''; //记录第一次的错误信息
var $error_report = true; //是否输出错误信息
var $error_halt = true; //出错后是否停止执行
//为成员变量赋值
function setVal($name,$value)
{
$this->$name = $value;
}
//取得成员变量的值
function getVal($name)
{
return $this->$name;
}
//捕获错误
function catchErr($msg)
{
if(empty($this->errMsg)) $this->errMsg = $msg;
if ($this->error_report) echo $this->errMsg;
if ($this->error_halt) exit;
return false;
}
//输出错误
function err($exit = false)
{
if (!empty($this->errMsg))
{
echo $this->errMsg;
if ($exit) exit;
}
}
}// end class
}// end if defined
?>
下面我们回到list.php中去,看子功能模块如何运作if(!defined("__CLASS_PHPCLASS__"))
{
define("__CLASS_PHPCLASS__",1);
class PhpClass{
var $debug = false; //是否显示调式信息
var $debugMsg = ''; //记录调式信息
var $errMsg = ''; //记录第一次的错误信息
var $error_report = true; //是否输出错误信息
var $error_halt = true; //出错后是否停止执行
//为成员变量赋值
function setVal($name,$value)
{
$this->$name = $value;
}
//取得成员变量的值
function getVal($name)
{
return $this->$name;
}
//捕获错误
function catchErr($msg)
{
if(empty($this->errMsg)) $this->errMsg = $msg;
if ($this->error_report) echo $this->errMsg;
if ($this->error_halt) exit;
return false;
}
//输出错误
function err($exit = false)
{
if (!empty($this->errMsg))
{
echo $this->errMsg;
if ($exit) exit;
}
}
}// end class
}// end if defined
?>
从前面的介绍我们知道了list.php,必有一个类CPage且其中必定有两个函数:
一个构造函数CPage(),一个execute();
通过构造函数的参数将$app对象接收到,那么简单代码如下:
CODE:
list.php
<?php
class CPage
{
function CPage(& $app) //$app就是Application对象的实例
{
}
function execute()
{
}
}
?>
由于很多子功能模块可能要完成一些共同的功能,如显示logo,copyright等,我们可以将这样共同的功能封装在一个类中,命名为Page类,作为所有子功能模块的父类,所有子功能模块都从它继承。<?php
class CPage
{
function CPage(& $app) //$app就是Application对象的实例
{
}
function execute()
{
}
}
?>
看一下Page.inc.php:
CODE:
<?
class Page
{
var $app;
var $vars=array();
function Page(&$app)
{
$this->app = & $app;
}
function setCopyRight()
{
$this->vars['copyright'] = "CopyRight:Lwg888";
}
}
?>
list.php中的CPage类就从Page类继承class Page
{
var $app;
var $vars=array();
function Page(&$app)
{
$this->app = & $app;
}
function setCopyRight()
{
$this->vars['copyright'] = "CopyRight:Lwg888";
}
}
?>
代码示例:
CODE:
<?php
include("Page.inc.php");
class CPage extends Page
{
var $pt;
var $app;
function CPage(& $app)
{
$this->Page($app);
}
function execute()
{
$db = $this->app->connectDb(); //利用Application对象中的数据库连接方法
$sql= "select * from table ...";
$this->app->includeClass ('PageTurn'); //载入PageTurn.inc.php翻页类文件
$pt = & new PageTurn(20); //初始化翻页类,每页显示20条
$pt->query($sql,$db->conn); //执行SQL语句
$this->pt = & $pt;
$this->show(); //显示网页
}
function show()
{
$tpl=$this->app->tpl(); //建立模板对象
$tpl->set("loop",$this->pt->field);
$tpl->set("copyright",$this->vars['copyright']); //Page类中的 $vars['copyright']
echo $tpl->parse('list.tpl'); //显示模板
}
}
?>
上面用到了分页类PageTurn与模板类Vant,大家可以参考下载中的相关类include("Page.inc.php");
class CPage extends Page
{
var $pt;
var $app;
function CPage(& $app)
{
$this->Page($app);
}
function execute()
{
$db = $this->app->connectDb(); //利用Application对象中的数据库连接方法
$sql= "select * from table ...";
$this->app->includeClass ('PageTurn'); //载入PageTurn.inc.php翻页类文件
$pt = & new PageTurn(20); //初始化翻页类,每页显示20条
$pt->query($sql,$db->conn); //执行SQL语句
$this->pt = & $pt;
$this->show(); //显示网页
}
function show()
{
$tpl=$this->app->tpl(); //建立模板对象
$tpl->set("loop",$this->pt->field);
$tpl->set("copyright",$this->vars['copyright']); //Page类中的 $vars['copyright']
echo $tpl->parse('list.tpl'); //显示模板
}
}
?>
讲了这么多,我们已经基本上弄清了用OOP+模板方式写程式的方法,下面就来总结它的好与歹。
如果你不喜欢用OOP方式编程,你可以说:类=累。我同意,但不以OOP方式编程,运行速度是会快一些,而你会变的很累,不管是业务逻辑的组织还是今后代码的维护,都不是一件轻松的事。在机器性能日益提高和网络宽频日益普及的今天,速度不是单方面追求的目标,我们要在速度与代码易用性、易编写性之间取得平衡。
从上面的讲解我们可以看出:完全实现了Model模型/逻辑、View视图/界面、Controller控制/流程 的分离。使得结构非常清晰,维护非常方便,模型设计者,界面设计者与流程控制设计者能更好的分工与合作。代码可重用,今后如果要开发一个新的项目,很快就能完成,因为你可能只需叫美工重新设计一下模板,或者稍稍修改一下子功能模块。
还有一点不得不提:
index.php是一个统一应用程序接口,通过$_GRT['action']或$_POST['action'],决定执行哪个子功能模块。当它执行该模块时是将它include进来,因此所有的操作都是在index.php中进行,所呈现的网页都是index.php?action=...,这样使我们控制流程非常方便。比如要显示用户列表,只需调用list.tpl模板,要显示错误信息,只需调用errmsg.tpl模板,甚至不必要使用header("location:..")来转向,不管是显示用户列表还是显示错误信息,所有的$_GRT或$_POST或其它变量都还在,不用象转向时那样用?xx=...传一大堆变量过去,不是有不少人常问“数组能不能传递?”“对象能不能传递?”,
写到这里,一点劣见,望大家指正 。 欢迎进入PHP开发资源论坛讨论。
相关文章
图文推荐
主 站 资 源
论 坛 资 源
·SQLite结合PHP的开发实践
·简介一种PHP设计模式:DPT
·在PHP中使用XML-RPC来构造Web Service简介
·PHP网站注入方法之深度分析
·教你使用Apache的rewrite技术来实现URL重写
·Wordpress 2.5 Tags 标签功能
·详细解析:Apache服务器实现的用户验证
·set_include_path在win和linux下的区别
·自定义SESSION(一)——文件
·PDO函数库使用入门
·简介一种PHP设计模式:DPT
·在PHP中使用XML-RPC来构造Web Service简介
·PHP网站注入方法之深度分析
·教你使用Apache的rewrite技术来实现URL重写
·Wordpress 2.5 Tags 标签功能
·详细解析:Apache服务器实现的用户验证
·set_include_path在win和linux下的区别
·自定义SESSION(一)——文件
·PDO函数库使用入门
热门技术文档
·SQLite结合PHP的开发实践
·简介一种PHP设计模式:DPT
·在PHP中使用XML-RPC来构造Web Service简介
·PHP网站注入方法之深度分析
·教你使用Apache的rewrite技术来实现URL重写
·Wordpress 2.5 Tags 标签功能
·关于Servlet及JSP中遇到的多线程同步问题
·详细解析:Apache服务器实现的用户验证
·set_include_path在win和linux下的区别
·自定义SESSION(一)——文件
·简介一种PHP设计模式:DPT
·在PHP中使用XML-RPC来构造Web Service简介
·PHP网站注入方法之深度分析
·教你使用Apache的rewrite技术来实现URL重写
·Wordpress 2.5 Tags 标签功能
·关于Servlet及JSP中遇到的多线程同步问题
·详细解析:Apache服务器实现的用户验证
·set_include_path在win和linux下的区别
·自定义SESSION(一)——文件
最新图文档
本站编辑推荐:(本站开通Delphi4PHP专区,欢迎进入论坛交流!)
- · 3分钟快速了解 Delphi for PHP 特色 (中文), PDF档
- · 购买Delphi for PHP的五大理由, PDF档
- · Delphi for PHP 使用规格介绍, PDF档
- · Delphi for PHP 問答集 (From CodeGear)
- · Delphi for PHP 产品价格表
编缉最近更新文章
网站赞助商
搜索您感兴趣的内容




