在使用php的oo模式開發系統時,通常大家習慣將每個類的實現都存放在乙個單獨的檔案裡,這樣會很容易實現對類進行復用,同時將來維護時也很便利,這也是oo設計的基本思想之一。如果需要使用乙個類,只需要直接使用include/require將其包含進來即可。但隨著專案規模的不斷擴大,使用這種方式會帶來一些隱含的問題:如果乙個php檔案需要使用很多其它類,那麼就需要很多的require/include語句,這樣有可能會造成遺漏或者包含進不必要的類檔案。如果大量的檔案都需要使用其它的類,那麼要保證每個檔案都包含正確的類檔案肯定是乙個噩夢。
php5為這個問題提供了乙個解決方案,這就是類的自動裝載(autoload)機制。
/* nova\framework\autoloader.php */
<?php
namespace nova\framework;
class autoloader
/*** autoloader的入口函式
* 用於建立autoloader的唯一例項化物件
** @return autoloader
*/public static function init()
/*** 類的自動載入方法
* 根據傳入引數$classname,自動引入相應類的原始檔
** @param string $classname
*/public function import($classname)
}}
這個自動載入模擬較簡單,初始化後,只有乙個主要的方法import(),它通過解析傳入進來的類名(由於我們使用了命名空間,所以類名基本上都是「nova\framework\autoloader這樣的形式」),從專案根目錄開始,按照類名本身指定的路徑來定位相應類的原始碼檔案,如果存在該檔案,則將其引入。
預設情況下,php是將session以檔案的形式存在伺服器上,具體可以在php.ini中配置。但是實際生產環境中,稍大些的站點都不會採用這種形式,一般都會借助sql資料庫、或者nosql型別的如memcached、redis等快取伺服器來儲存session,這樣做可以有效緩解php伺服器的壓力和處理速度,提高併發能力。
在nova中我們使用redis伺服器來訪問session。
/* nova\framework\session.php
<?php
namespace nova\framework;
class session
public static function start()
/*** session_start時會呼叫該函式
** @return bool
*/public static function open()
/*** 使用sessionid作為key,從redis中讀取相應資料,並將資料寫入session變數
** @return bool
*/public static function read()
return true;
}/**
* 將session變數的內容寫入redis中
** @return bool
*/public static function write()
return true;
}/**
* 通過刪除redis中sessionid對應的資料來登出session
* session_destory()是自動呼叫
** @return bool
*/public static function destory()
setcookie(session_name, self::$sessionid, 1, cookie_path, cookie_domain, false);
return true;
}public static function close()
public static function gc()
/*** 返回乙個sessionid
* 若cookie中已存在sessionid,則直接返回該sessionid
* 若不存在,則按照規則新生成乙個sessionid
** @return string session id
*/public static function get_sid()
else
//返回sessionid
return self::$sessionid;
}}
nova基本上重寫了session的一些核心處理函式。為了方便使用自定義的全域性redis rootkey,nova把redis方法也重寫了。
<?php
namespace nova\framework;
class redis extends \redis
public static function get_instance($rediskey = redis_root)
self::$_instanceobj[$rediskey]->rediskey = $rediskey;
return self::$_instanceobj[$rediskey];
}public function set_group($groupname = "")
$this->groupname = $groupname;
$this->grouppath = implode(":", explode("/", $groupname)) . ":";
return true;
}public function set($key, $data, $groupname = "", $timeout = session_timeout)
else
if (is_array($data))
$rediskey = $groupname . $key;
return $this->_redis->setex($rediskey, $timeout, $data);
}public function get($key, $groupname = "")
else
$rediskey = $groupname . $key;
$return = "";
$temp = $this->_redis->get($rediskey);
$return = json_decode($temp, 1);
return empty($return) ? $temp : $return;
}public function delete($key, $groupname = "")
else
$rediskey = $groupname . $key;
return $this->_redis->delete($rediskey);
}public function exists($key, $groupname = "")
else
$rediskey = $groupname . $key;
return $this->_redis->exists($rediskey);
}}
你可以在github上檢視nova專案的源**。 自己動手寫PHP框架(二)
在使用php的oo模式開發系統時,通常大家習慣將每個類的實現都存放在乙個單獨的檔案裡,這樣會很容易實現對類進行復用,同時將來維護時也很便利,這也是oo設計的基本思想之一。如果需要使用乙個類,只需要直接使用include require將其包含進來即可。但隨著專案規模的不斷擴大,使用這種方式會帶來一些...
自己動手寫AJAX框架
如果你了解了js物件導向,http協議,那麼就自己動手寫乙個ajax框架就可以了。小技術,大家不要笑啊!原始碼 注釋就不寫了,應該不難看懂的 使用就很簡單了。1.先插入引用。2.然後寫 js ajaxtest.htm 3.用c 建乙個一般處理程式 ajaxtest.ashx 這裡的框架使用就和jqu...
自己動手寫框架 一
php框架接觸有一段時間,主要是kohana和thinkphp。這兩個框架各有各的特色,總體來說kohana還是相對來說比較簡單,但是國內資料較少。簡單的,我把我的這個框架命名為demo.框架搭建第一步,總體目錄規劃 classes controller models views template ...