說到PHP單入口模式,很快想到關於PHP的一些架構,zend,thinkphp,qeephp,還有cakephp 等,它們都採用了統一的入口,可以根據不同的需要,分前台入口後台入口或者其他動作許可權入口,這樣的設計模式優點很明顯,比如。許可權控制,url重寫,結 合MVC清晰地目錄結構。這些都是單入口模式所帶來的便利,當然這樣的也會帶來執行效率的疑問。
由單入口模式,我順便提下單件模式,結合OO特性。
<?phpclass A{private static $tag = null;private function __construct(){}static function getObject(){if( null == self::$tag){self::$tag = new A();}return self::$tag;}}$object1 = A::getObject();$object2 = A::getObject();if($object1 === $object2){echo "同一對象";}else{echo "不同對象";}
通過$tag標示class是否執行個體化,$tag為空白,則執行個體化當前類並賦給$tag,如果不為空白則返回這個指向執行個體的static 屬性。
繼續知識延伸...原廠模式
原廠模式是由一個工廠類根據傳入的參量決定建立出哪一種產品類的執行個體。原廠模式在小項目不很實用。不過這種編碼形式是非常值得去學習和使用,而且有利於應用於任意規模的項目中。結合MVC結構,可以聯想到當前的一些架構結構。
下面是‘逍遙冰心’寫關於5個架構的比較,有些內容還是比較客觀的。
http://www.demonitech.com/index.php/archives/100
單入口模式(以thinkphp為例)
<?php// 定義ThinkPHP架構路徑define('THINK_PATH', './ThinkPHP/');//定義項目名稱和路徑define('APP_NAME', 'Myapp');define('APP_PATH', '.');// 載入架構入口檔案 require(THINK_PATH."/ThinkPHP.php");//執行個體化一個網站應用程式執行個體App::run();
thinkphp對單一入口的解釋
“單一入口通常是指一個項目或者應用具有一個統一(但並不一定是唯一)的入口檔案,也就是說項目的所有功能操作都是通過這個入口檔案進行的,並且往往入口檔案是第一步被執行的。
單一入口的好處是項目整體比較規範,因為同一個入口,往往其不同操作之間具有相同的規則。另外一個方面就是單一入口帶來的好處是控制較為靈活,因為攔截方便了,類似如一些許可權控制、使用者登入方面的判斷和操作可以統一處理了。
或者有些人會擔心所有網站都通過一個入口檔案進行訪問,是否會造成太大的壓力,其實這是杞人憂天的想法。”
讓我看看thinkphp結構
流程:
thinkphp.php下,
<?php$GLOBALS['_beginTime'] = microtime(TRUE);if(!defined('APP_PATH')) define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']));if(!defined('RUNTIME_PATH')) define('RUNTIME_PATH',APP_PATH.'/Runtime/');if(defined('RUNTIME_ALLINONE') && is_file(RUNTIME_PATH.'~allinone.php')) { // ALLINONE 模式直接載入allinone緩衝 $result = require RUNTIME_PATH.'~allinone.php'; C($result); // 自動化佈建為運行模式 define('RUNTIME_MODEL',true);}else{ if(version_compare(PHP_VERSION,'5.0.0','<')) die('require PHP > 5.0 !'); // ThinkPHP系統目錄定義 if(!defined('THINK_PATH')) define('THINK_PATH', dirname(__FILE__)); if(!defined('APP_NAME')) define('APP_NAME', basename(dirname($_SERVER['SCRIPT_FILENAME']))); if(is_file(RUNTIME_PATH.'~runtime.php')) { // 載入架構核心編譯緩衝 require RUNTIME_PATH.'~runtime.php'; }else{ // 載入編譯函數檔案 require THINK_PATH."/Common/runtime.php"; // 產生核心編譯~runtime緩衝 build_runtime(); }}// 記錄負載檔案時間$GLOBALS['_loadTime'] = microtime(TRUE);?>
檢查THINK_PATH、 APP_NAME、 APP_PATH、 RUNTIME_PATH 定義
載入系統定義檔案 編譯緩衝目錄 載入系統核心類庫 根據PHP的版本載入相容函數庫 產生核心編譯緩衝~runtime.php,至於後面太多細碎的工作。然後build項目設定檔,公用檔案。。然後到後面的app,中間 Dispatcher,GetModule還有很多我都跳過了,
最後又回到入口。
總結:
這些跟據最近看的東西然後把一些有聯絡沒聯絡的都添加進去,整體上把單件模式,原廠模式,單入口模式 籠統的概括了下,還需要更深入的去理解,根據thinkphp瞭解下一個架構的一些基本的操作流程,結合MVC,我覺得thinkphp較之zend還是 不夠強大。但是適合我們這些菜鳥學習。