<?php
/*步。
哈哈。我們要懂模仿。 */
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
/**
嘿。 extract 前面加個 @雞蛋做什么呢??抑制錯誤的。還不懂的話。自己百度了。
為什么用extract()函數呢. 他就是把$_GET、$_POST中的內容變成變量的形式,平時我們程序 是不是要常使用 $_POST $_GET來獲取傳遞的變量呀。是不是感覺賊麻煩呀。
比如 $_POST['xx'] 這樣接受是挺好。但寫多了很麻煩是吧。我是感覺麻煩。我現在想直接就 $xx就可以獲取傳遞過來的東西。那怎么辦呢。
就用了 extract()函數來實現這么一個技巧。參數:EXTR_OVERWRITE的意思是如果有沖突,覆蓋已有的變量。 這個技巧在discuz 論壇上也有應用。
*/
unset($_POST, $_GET);
/**
unset() 好處不用說了吧。 釋放 $_POST $_GET 數組 ,因為已經不需要他們了。
明天放假了.今天在寫點羅.放假沒空寫了.要陪老婆,大家看了有什么不明白的.可以跟帖問.我懂的我會回答.謝謝
繼續::
2007-12-21
吃完中午開始分析了點代碼.時間不多.復制PHP內容到剪貼板PHP代碼: */
require PHPCMS_ROOT.'/config.inc.php';
/**
加裁整站的配置參數文件。一般的程序都會有這個文件。做什么的呢?比如一些數據庫連接地址。用戶名,密碼等。需要用到的參數都定義在這個文件里面。這樣以后配置變了。我們只要改動下這個文件里面的
變量值就好。是不是很方便呢。呵呵. 在這里說下 require() 這個加載函數。 require 和 include 都是用來加載其他PHP文件用的。但他們是有區別的。 require 函數:是"預解釋"函數。就是程序一加載,就執行了require函數。而include 呢。是個過程加載函數。我們可以在邏輯里比如: if 里面使用include 來動態的加載其他程序片段。而require 就不行。
*/
require PHPCMS_ROOT.'/languages/'.$CONFIG['language'].'/phpcms.lang.php';
/**
顧名思義: 這個就是加載語言包了。PHP的國際化目前做得最多的。就是直接用PHP文件來實現。 在 phpcms.lang.php 文件里面定義程序中要用到的中文信息。然后在程序一開始就加載。那里程序里面
就可以使用這個文件里面的變量和一切。那么就簡單了。模板上就不需要直接寫中文信息了。直接用這個文件里面定義的變量等來替換。從而實現國際化。over!!!最好自己打開這個語言文件再加上自己思考下。就知道。原來如此簡單。
*/
define('PHPCMS_PATH', $CONFIG['rootpath']);
define('PHPCMS_CACHEDIR', $CONFIG['cachedir']);
/**
$CONFIG['rootpath'] 這個就是全局配置文件 config.inc.php 文件里面數據庫信息。等全部配置信息。在這里把他們定義為 常量。 為什么需要定義為常量呢。因為作者感覺這樣寫爽羅。呵呵。其實因為后面
用到這兩個變量多。所以干脆定義為常量。方便使用。再多說一個技巧: $CONFIG['rootpath'] 其實也可以寫成 $CONFIG[rootpath] 但是最好不要這樣。為什么呢。因為PHP引擎會先判斷 rootpath 是不是常量。如果不是才會認定 $CONFIG[rootpath] 是數組。 這樣性能上就差了一點點了。 再多說一個技巧: 為什么程序多數都用 '' 單引號呢而不用 "" 雙引號呢。因為這樣效率好, "" 雙引號。
php引擎還會先檢查里面是否有變量,如果有就解釋。而 '' 單引號不會做這一步的檢查。而直接就當成字符竄了。所以效率上也會有一點點影響哦。
*/
$CONFIG['enablephplog'] ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE);
/*$CONFIG['enablephplog'] 是否開啟錯誤日志設置。這個設置在全局配置文件里面.config.inc.php 。 這里使用了 三目運算符 偶最喜歡用了。一些簡短的邏輯判斷。可以使用 ? : ; 來實現比較簡潔
set_error_handler() 這個函數就大有來頭了。php4里面的典型自定義程序出錯后行為的一個函數。十分好用。怎么用呢? set_error_handler(函數) 的參數也是一個函數。這個函數。反映了程序出錯后行為的。
phpcms_error 函數存在,set_error_handler就是用用戶自定義的錯誤處理函數來處理程序中的錯誤,phpcms_error 在global.func.php 全局函數里面。
*/
function phpcms_error($errno, $errmsg, $filename, $linenum, $vars)
{
$filename = str_replace(PHPCMS_ROOT, '.', $filename);
$filename = str_replace("\\", '/', $filename); // 把win平臺的 \\ 換成 /兼容常見系統的路徑
if(!defined('E_STRICT')) define('E_STRICT', 2048);
$dt = date('Y-m-d H:i:s');
$errortype = array (
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing Error',
E_NOTICE => 'Notice',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice',
E_STRICT => 'Runtime Notice'
);
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = "<errorentry>\n";
$err .= "\t<datetime>" . $dt . "</datetime>\n";
$err .= "\t<errornum>" . $errno . "</errornum>\n";
$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";
if (in_array($errno, $user_errors))
{
$err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
}
$err .= "</errorentry>\n\n";
echo $err;
error_log($err, 3, PHPCMS_ROOT.'/data/php_error_log.xml');
chmod(PHPCMS_ROOT.'/data/php_error_log.xml', 0777);
}
/*就是這個鳥蛋。 現在我們慢慢來干掉他。呵呵 這個自定義出錯信息函數默認帶有四個參數。 第一個參數 $errno 是程序出錯的等級。 第二參數是程序出錯的界面信息。第三是出現錯誤的程序文件名。
第四是 第幾行出現錯誤。第五個參數。要不要都行是當前變量狀態的快照.看吧。我們有這些信息后。想定義怎么樣的錯誤信息給客戶看都很容易了是吧?但現在我們是要上一
*/
?>