您的位置:BugFree > 论坛 > 技术支持 > Learn BugFree[阅读BugFree代码] > BugFree的初始化文件--撰写于2005/09/08
2005-05-26 13:42:42 BugFree的初始化文件--撰写于2005/09/08
#1
wwccss
访问次数 : 593
注册日期 : 05-05-01 10:08
上次访问 : 10-07-19 11:44
以前曾经看过其他的开源程序,感觉这些软件功能十分的优良,程序的设计技巧也非常的巧妙,但难以阅读,遗憾。其中难以阅读的一个重要方面就是搞不清楚文件的包含关系。

我形容通常的包含关系是一个网状的包含。A.php包含若干个文件,在这若干个文件中,又分别包含其他的文件,当你跟踪代码的时候,就会比较累,不知道到底是那个文件出了问题。

后来我在开发程序的时候就竭力去避免这个问题,我的解决方法如下:
根据不同的应用环境,建立若干个setup程序,比如SetupBug.inc.php, SetSite.inc.php,等等,可以写出很多个了。在这setup程序里面,负责包含相应的类定义文件,函数库文件,配置文件,完成相应的变量处理,然后在相应的程序里面包含这个setup程序就可以了。

这样的处理,最终代码看起来如下:

setup.inc.php
[quote]require_once("config.php");
require_once("class.php");
require_once("functions.php");[/quote]
filea.php
[quote]require_once("setup.inc.php");[/quote]
……

这样具体的应用程序可以保证非常简单的包含关系,将所有的改动集中到setup的程序里面去。

那么以BugFree的setup程序来做一个解释:
1. 设立包含路径,设定BugFree的baseurl
[quote]$BugConfig["ScriptDir"] = eregi_replace("/Admin" , "" , dirname($_SERVER["SCRIPT_FILENAME"]));
$BugConfig["PathSeparator"] = eregi("WIN",PHP_OS) ? ";" : ":";
ini_set("include_path", $BugConfig["ScriptDir"] . "/Include/" . $BugConfig["PathSeparator"] . $BugConfig["ScriptDir"] . "/Include/Class/" . $BugConfig["PathSeparator"] . $BugConfig["ScriptDir"] . "/Include/Class/PhpMailer");
$BugConfig["BaseURL"] = "http://" . $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . eregi_replace("/Admin" , "", dirname($_SERVER["SCRIPT_NAME"]));[/quote]
2. 包含相应的文件。
[quote]require_once("ConfigBug.inc.php"); // Config file.
require_once("FunctionsMain.inc.php"); // Functions file.
require_once('ADO/adodb.inc.php'); // ADO class.
require_once("Smarty/Smarty.class.php"); // Smarty class.
require_once('JS.class.php'); // JS class.
require_once('Html.class.php'); // Html class.
require_once('Page.class.php'); // Page class.[/quote]
3. 连接数据库,返回全局变量$MyDB
[quote]$MyDB = &ADONewConnection("mysql");
$MyDB->Connect($BugConfig["BugDB"]["Host"],$BugConfig["BugDB"]["User"],$BugConfig["BugDB"]["Password"],$BugConfig["BugDB"]["Database"]);
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;[/quote]
4. 初始化smarty
[quote]$TPL = new Smarty;
$TPL->caching = false;
$TPL->template_dir = $BugConfig["ScriptDir"] . "/" . 'Template';
$TPL->compile_dir = $BugConfig["ScriptDir"] . "/" . 'Compile';
$TPL->compile_check = true;[/quote]
5. 设定语言,样式表,cookie
[quote]/* Set the language. */
$BugConfig["BugLang"] = isset($_COOKIE["BugLang"]) ? $_COOKIE["BugLang"] : $BugConfig["DefaultLang"];
@setcookie("BugLang", $BugConfig["BugLang"], time()+360000);

/* Include the Language file, send heard info. */
require_once("LangFile/" . $BugConfig["BugLang"] . ".php");
@header("Content-Type: text/html; Language=".$BugConfig["Charset"]);
@header("Cache-control: private");

/* Set the css style. */
$BugConfig["CssStyle"] = isset($_COOKIE["CssStyle"]) ? $_COOKIE["CssStyle"] : "Default";
@setcookie("CssStyle", $BugConfig["CssStyle"], time()+360000);[/quote]
6. 判断用户是否合法
[quote]/* Judge whether the user is a valid user. */
if(!eregi("Login.php",$_SERVER["PHP_SELF"]))
{
bugJudgeUser($_REQUEST["BugUserName"], $_REQUEST["BugUserPWD"]);
bugGetUserACL($_SESSION["BugUserName"]);
}[/quote]
7. 模板变量赋值
[quote]/* Assign $Config defined in the Lang file to the template. */
$TPL->assign("BugConfig", $BugConfig);
$TPL->assign("TplConfig", $TplConfig);
$TPL->assign("CssStyle", $BugConfig["CssStyle"]);[/quote]
经过这样的处理,在后面的程序的时候,只要在文件的开头部分包含SetupBug.inc.php就可以了,将开发的精力集中到业务逻辑上就可以了。

这样做的优缺点:
优点:

层次结构比较清楚。
做改动比较方便。
增加新的功能也比较方便,只需要修改setup程序就可以了。

缺点:

会牺牲一点执行的效率,不过这相对于php的执行速度来讲,不足挂齿。解决的方案是细化setup程序,分出若干个setup程序来,每个setup程序包含不同的类库文件,这样可以避免这个问题。
回帖
2005-11-08 08:21:53
#2
刘世伟
访问次数 : 1
注册日期 : 05-11-08 06:29
上次访问 : 09-10-29 21:05
不喜欢在php中用大量的类,
bs程序的特点决定了,适合使用过程进行编程.
每次提交,都只处理很少一块东西,用过程编程,正合适.

在我的项目中,一般只包含一个设置文件,和一个全局的自定义函数, 大部分的处理过程,一般几行代码就搞定了.
回帖