shopnc是國內比較成熟的一套b2b2c系統。咱們也開發過本身的一套b2b2c系統,可是相比較了下,確實有很多的差距。
通常在初期咱們只會用到目錄裏的shop文件夾。(訪問默認的首頁)
$site_url = strtolower('http://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/index.php')).'/shop/index.php');
include('shop/index.php');
會自動跳轉到shop/index.php裏面去。
每一個項目都會有對應index.php(好比cms,mobile等項目裏面)用來定義各個項目的屬性。(該文件主要加載一些內置文件和資源)
同時運行核心函數方法:Base::Run()
public static function run(){
self::cp();
self::init();
self::control();
}
該方法是一個靜態方法(該Base類也是一個final類,對於肯定了沒有繼承的類,用final繼承類能夠提高運行效率,輸出肯定的方法)
在run的方法中,運行了Base自身類的cp,init,control方法cp主要是用來限定肯定的host訪問的
private static function cp(){
if (self::CPURL == '') return;
if ($_SERVER['HTTP_HOST'] == 'localhost') return;
if ($_SERVER['HTTP_HOST'] == '127.0.0.1') return;
if (strpos(self::CPURL,'||') !== false){
$a = explode('||',self::CPURL);
foreach ($a as $v) {
$d = strtolower(stristr($_SERVER['HTTP_HOST'],$v));
if ($d == strtolower($v)){
return;
}else{
continue;
}
}
header('location: http://www.test.com');exit();
}else{
$d = strtolower(stristr($_SERVER['HTTP_HOST'],self::CPURL));
if ($d != strtolower(self::CPURL)){
header('location: http://www.test.com');exit();
}
}
}
該方法分析:從程序結構上,感受沒有什麼做用,校驗是否是指定的網址。可是對於受權的域名網址卻很是有用,起初我一直沒有明白這個方法作什麼用的,覺得是爲了防止CSRF攻擊,可是csrf攻擊自己仍是調用了對應的URL,沒法進行避免。可是對於加密受權做用卻很是大。假如該套程序受權給了www.test.com,www.test1.com倆個域名使用,同時把Base文件進行加密處理,而後爲其配置對應的文件。正常狀況下,系統是能夠運行的,可是隻有該域名能夠正常運行(這就是程序綁定運行域名的邏輯)。
初始化方法,通常系統的初始化方法都差很少,主要初始化對應參數配置(該配置能夠經過當前的項目定義進行獲取,同時開啓session)還有一些語言配置。
核心方法control
private static function control(){
//二級域名
if ($GLOBALS['setting_config']['enabled_subdomain'] == '1' && $_GET['act'] == 'index' && $_GET['op'] == 'index'){
$store_id = subdomain();
if ($store_id > 0) $_GET['act'] = 'show_store';
}
$act_file = realpath(BASE_PATH.'/control/'.$_GET['act'].'.php');
$class_name = $_GET['act'].'Control';
if (!@include($act_file)){
if (C('debug')) {
throw_exception("Base Error: access file isn't exists!");
} else {
showMessage('抱歉!您訪問的頁面不存在','','html','error');
}
}
if (class_exists($class_name)){
$main = new $class_name();
$function = $_GET['op'].'Op';
if (method_exists($main,$function)){
$main->$function();
}elseif (method_exists($main,'indexOp')){
$main->indexOp();
}else {
$error = "Base Error: function $function not in $class_name!";
throw_exception($error);
}
}else {
$error = "Base Error: class $class_name isn't exists!";
throw_exception($error);
}
}
該方法的總結:該方法根據url傳遞的act和op找到對應默認的class和操做方法(這種自動加載實例化的方法和最簡單的mvc結構裏設置的其實思路是同樣的)。採用了自動加載類Base::autoload.
小結:
用了一個訪問域名運行檢測,作受權認證。全局變量參數控制載入不一樣的配置,生成不一樣的網站。(一個大系統架設多個網站系統的思路,這樣能夠公用相同部分的配置)。用final肯定基類不容許繼承(同時有助於加密)。自動加載設定好加載對應項目的控制器,經過外部訪問act和op的方式訪問不一樣的方法,通用框架類的自動加載方法。php