rare內建了類別自動裝載功能,當使用一個類別的使用直接使用而無須require(include) 類別檔案。 這類自動裝載功能非常的獨立,若你需要,可以直接在其他框架(任意php程式)中使用。 1.先引入 rareAutoLoad.class.php 2.註冊功能
-
/**
- * 類別自動裝載
- * http://raremvc.googlecode.com
- * http://rare.hongtao3.com
- * @example
- * include 'rareAutoLoad.php';
- * $option=array('dirs'=>'/www/lib/share/,/www/lib/api/',//class 從那些目錄中找出
- * 'cache'=>' /tmp/111111.php',//class path 快取檔案
- * 'suffix'=>'.class.php' //需要類別自動裝載的php類別檔案的後綴
- * "hand"=> true, //是否手動更新class 路徑文件,為false 時緩存文件寫入到指定的cache文件中去,
- * //為true 是需要手動允許autoLoad.php 文件
- * );
- * rareAutoLoad::register($option);
- *
- * 參考了symfony 的類別自動裝載
- * 為了提供效率,將類別的位置保存到快取檔案中,在第一次使用的時候會對dirs中的檔案目錄進行掃描
- * 需要自動裝載的類別的檔案命名要求必須以.class.php 結束,如檔案名稱為a.class.php 所定義的類別可以被掃描到而a .php的檔案會忽略掉
- * 類別名稱和檔案命名可以沒有關係如a.class.php 檔案中可以定義class b{}
- *
- * @author duwei
- *
- */
- class rareAutoLoad
- {
- private static $instance=null;
- {
- private static $ $registered=false;
-
- private $cacheFile=null;
- private $classes=array();//對應class 類別名稱與對應檔案路徑
- private $option;
-
- private $hand=false;//是否手動執行此腳本進行class路徑掃描,
-
- private $reloadCount=0;//reload操作的次數
- /**
- * @param array $option 需要參數 dirs:掃描目錄 cache:快取檔案
- */
- public function __construct($option){
-
- if(!isset($option['suffix'])) $option['suffix']=".class.php";//檔案後綴
- $this->option=$option;
- if(!isset($option['cache'])){
- $trac=debug_backtrace(false);
- $calFile=$trac[2][ 'file'];
- $option['cache']="/tmp/rareautoLoad_".md5($calFile)."_".filemtime($calFile);
- @unlink($option['cache ']);
- }
- if(isset($option['hand']))$this->hand=(boolean)$option['hand'];
- $this->cacheFile= $option['cache'].".php";
- $this->getClasses();
- }
-
- /**
- * 取得DAutoLoad 的單一實例物件
- * @param array $option
- * @return DAutoLoad
- */
- private static function getInstance( $option){
- if (!isset(self::$instance)){
- self::$instance = new rareAutoLoad($option);
- }
- return self::$instance;
- }
-
- /**
- * 註冊自動裝載
- * @param array $option array('dirs'=>'/www/lib/share/,/www/lib/api/','cache'=>'/tmp/ 111111.php');
- * @throws Exception
- */
- public static function register($option) {
- if (self::$registered)return;
- // ini_set( 'unserialize_callback_func', 'spl_autoload_call');
- if (false === spl_autoload_register(array(self::getInstance($option), 'autoload'))){
- die(s register %able) s::autoload as an autoloading method.', get_class(self::getInstance())));
- }
- self::$registered = true;
- }
-
- /* *
- * spl_autoload_call 呼叫load class
- * 若快取檔案中的類別的路徑不正確,會嘗試reload一次
- * 對reload後還不存在的類別快取中記錄其key,標記為false,以避免快取檔案多次無效的更新
- * 對於使用class_exists 進行判斷時預設會進行autoload操作
- * @param $class
- * @return
- */
- public function autoload($class){
- if(class_exists($class, false) || interface_exists($class, false)) return true;
- if ($this-this- >classes && isset($this->classes[$class]) ){
- $file=$this->classes[$class];
- if(!$file)return false;
- if( !file_exists($file) && !$this->hand){
- $this->reload();
- return $this->autoload($class);
- }
- require($ file);
- return true;
- }{
- $this->reload();
- if(isset($this->classes[$class])){
- $file= $this->classes[$class];
- if(!$file)return false;
- require($file);
- return true;
- }else{
- $this-> classes[$class]=false;
- $this->saveCache();
- }
- }
- return false; }
- /**
- * 取得類別名稱清單
- * @return
- */
- 私有函數 getClasses(){
- if(file_exists($this->cacheFile)){
- $this->classes=require($this -> cacheFile);
- if(is_array($this->classes))return true;
- }
- $this->classes=array();
- $this->; reload();
- }
-
- /**
- * 重新掃描一次
- * 並將類別名稱的位置資訊儲存到cache 中
- * @return
- */
- 原生函數 reload(){
- $this->reloadCount++;
- if($this-> ; hand)return;
- $cachedir=dirname($this->cacheFile);
- $this->directory($cachedir);
- if(!is_writable($cachedir)) die(' 無法寫入儲存! is_array($dirs)) $dirs=explode(",", $dirs);
-
- $dirs=array_unique($dirs);
- foreach($dirs as $dir) {
- if (!$dir || !file_exists($dir))繼續;
- $this->scanDir($dir);
- }
- $this->saveCache();
- }
-
- 原生函數 saveCache(){
- if($this->hand)return;
- $phpData=" if(!is_array($this->classes))$this->classes=array();
- ksort($this->classes);
- $phpData.=" return ".var_export( $this->classes,true).";";
- file_put_contents($this->cacheFile, $phpData,LOCK_EX);
- clearstatcache();
- }
-
- /**
- * 掃描資料夾以及檔案
- * 只有 $this->option['suffix'] 命名的檔案才會被掃描到
- * @param $dir
- * @return
- */
- 乾燥函數scanDir($dir){
- $files=scandir($dir,1);
- foreach($files as $fileName){
- $file=rtrim( $dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$fileName;
- if(is_dir($file) && strpos($fileName,'.')!==0){
- $this- >scanDir($file);
- }else{
- if($this->str_endWith($fileName,$this->option['suffix'])){
- preg_match_all('~ ^s*(?:abstracts+|finals+) ?(?:class|interface)s+(w+)~mi', file_get_contents($file), $classes);
- foreach ($classes[1] as $class) {
- $this->classes[ $class] = $file;
- }
- }
- }
- }
- }
-
- 裸函數目錄($dir ){
- return is_dir($dir)或($this->directory(dirname($dir)) 和mkdir($dir, 0777));
- }
-
- function str_endWith($ str,$subStr){
- return substr( $str, -(strlen($subStr)))==$subStr;
- }
- }
-
-
-
- 複製代碼
-
|