說到PHP單入口模式,很快想到關於PHP的一些框架,zend,thinkphp,qeephp,還有cakephp 等,它們都采用了統一的入口,可以根據不同的需要,分前台入口后台入口或者其他操作權限入口,這樣的設計模式優點很明顯,比如。權限控制,url重寫,結 合MVC清晰地目錄結構。這些都是單入口模式所帶來的便利,當然這樣的也會帶來執行效率的疑問。
由單入口模式,我順便提下單件模式,結合OO特性。
<?php
class 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還是 不夠強大。但是適合我們這些菜鳥學習。