自己動手寫PHP框架(二)

2021-07-30 11:29:28 字數 3570 閱讀 7777

在使用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 ...