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程序包含不同的类库文件,这样可以避免这个问题。 |
回帖 |
刘世伟 访问次数 : 1 注册日期 : 05-11-08 06:29 上次访问 : 09-10-29 21:05 |
不喜欢在php中用大量的类, bs程序的特点决定了,适合使用过程进行编程. 每次提交,都只处理很少一块东西,用过程编程,正合适. 在我的项目中,一般只包含一个设置文件,和一个全局的自定义函数, 大部分的处理过程,一般几行代码就搞定了. |
回帖 |