首頁 > 後端開發 > php教程 > php類別自動載入

php類別自動載入

WBOY
發布: 2016-07-25 09:09:47
原創
1056 人瀏覽過

rare內建了類別自動裝載功能,當使用一個類別的使用直接使用而無須require(include) 類別檔案。

這類自動裝載功能非常的獨立,若你需要,可以直接在其他框架(任意php程式)中使用。

1.先引入 rareAutoLoad.class.php

2.註冊功能

  1. /**
  2. * 類別自動裝載
  3. * http://raremvc.googlecode.com
  4. * http://rare.hongtao3.com
  5. * @example
  6. * include 'rareAutoLoad.php';
  7. * $option=array('dirs'=>'/www/lib/share/,/www/lib/api/',//class 從那些目錄中找出
  8. * 'cache'=>' /tmp/111111.php',//class path 快取檔案
  9. * 'suffix'=>'.class.php' //需要類別自動裝載的php類別檔案的後綴
  10. * "hand"=> true, //是否手動更新class 路徑文件,為false 時緩存文件寫入到指定的cache文件中去,
  11. * //為true 是需要手動允許autoLoad.php 文件
  12. * );
  13. * rareAutoLoad::register($option);
  14. *
  15. * 參考了symfony 的類別自動裝載
  16. * 為了提供效率,將類別的位置保存到快取檔案中,在第一次使用的時候會對dirs中的檔案目錄進行掃描
  17. * 需要自動裝載的類別的檔案命名要求必須以.class.php 結束,如檔案名稱為a.class.php 所定義的類別可以被掃描到而a .php的檔案會忽略掉
  18. * 類別名稱和檔案命名可以沒有關係如a.class.php 檔案中可以定義class b{}
  19. *
  20. * @author duwei
  21. *
  22. */
  23. class rareAutoLoad
  24. {
  25. private static $instance=null;
  26. {
  27. private static $ $registered=false;
  28. private $cacheFile=null;
  29. private $classes=array();//對應class 類別名稱與對應檔案路徑
  30. private $option;
  31. private $hand=false;//是否手動執行此腳本進行class路徑掃描,
  32. private $reloadCount=0;//reload操作的次數
  33. /**
  34. * @param array $option 需要參數 dirs:掃描目錄 cache:快取檔案
  35. */
  36. public function __construct($option){
  37. if(!isset($option['suffix'])) $option['suffix']=".class.php";//檔案後綴
  38. $this->option=$option;
  39. if(!isset($option['cache'])){
  40. $trac=debug_backtrace(false);
  41. $calFile=$trac[2][ 'file'];
  42. $option['cache']="/tmp/rareautoLoad_".md5($calFile)."_".filemtime($calFile);
  43. @unlink($option['cache ']);
  44. }
  45. if(isset($option['hand']))$this->hand=(boolean)$option['hand'];
  46. $this->cacheFile= $option['cache'].".php";
  47. $this->getClasses();
  48. }
  49. /**
  50. * 取得DAutoLoad 的單一實例物件
  51. * @param array $option
  52. * @return DAutoLoad
  53. */
  54. private static function getInstance( $option){
  55. if (!isset(self::$instance)){
  56. self::$instance = new rareAutoLoad($option);
  57. }
  58. return self::$instance;
  59. }
  60. /**
  61. * 註冊自動裝載
  62. * @param array $option array('dirs'=>'/www/lib/share/,/www/lib/api/','cache'=>'/tmp/ 111111.php');
  63. * @throws Exception
  64. */
  65. public static function register($option) {
  66. if (self::$registered)return;
  67. // ini_set( 'unserialize_callback_func', 'spl_autoload_call');
  68. if (false === spl_autoload_register(array(self::getInstance($option), 'autoload'))){
  69. die(s register %able) s::autoload as an autoloading method.', get_class(self::getInstance())));
  70. }
  71. self::$registered = true;
  72. }
  73. /* *
  74. * spl_autoload_call 呼叫load class
  75. * 若快取檔案中的類別的路徑不正確,會嘗試reload一次
  76. * 對reload後還不存在的類別快取中記錄其key,標記為false,以避免快取檔案多次無效的更新
  77. * 對於使用class_exists 進行判斷時預設會進行autoload操作
  78. * @param $class
  79. * @return
  80. */
  81. public function autoload($class){
  82. if(class_exists($class, false) || interface_exists($class, false)) return true;
  83. if ($this-this- >classes && isset($this->classes[$class]) ){
  84. $file=$this->classes[$class];
  85. if(!$file)return false;
  86. if( !file_exists($file) && !$this->hand){
  87. $this->reload();
  88. return $this->autoload($class);
  89. }
  90. require($ file);
  91. return true;
  92. }{
  93. $this->reload();
  94. if(isset($this->classes[$class])){
  95. $file= $this->classes[$class];
  96. if(!$file)return false;
  97. require($file);
  98. return true;
  99. }else{
  100. $this-> classes[$class]=false;
  101. $this->saveCache();
  102. }
  103. }
  104. return false; }
  105. /**
  106. * 取得類別名稱清單
  107. * @return
  108. */
  109. 私有函數 getClasses(){
  110. if(file_exists($this->cacheFile)){
  111. $this->classes=require($this -> cacheFile);
  112. if(is_array($this->classes))return true;
  113. }
  114. $this->classes=array();
  115. $this->; reload();
  116. }
  117. /**
  118. * 重新掃描一次
  119. * 並將類別名稱的位置資訊儲存到cache 中
  120. * @return
  121. */
  122. 原生函數 reload(){
  123. $this->reloadCount++;
  124. if($this-> ; hand)return;
  125. $cachedir=dirname($this->cacheFile);
  126. $this->directory($cachedir);
  127. if(!is_writable($cachedir)) die(' 無法寫入儲存! is_array($dirs)) $dirs=explode(",", $dirs);
  128. $dirs=array_unique($dirs);
  129. foreach($dirs as $dir) {
  130. if (!$dir || !file_exists($dir))繼續;
  131. $this->scanDir($dir);
  132. }
  133. $this->saveCache();
  134. }
  135. 原生函數 saveCache(){
  136. if($this->hand)return;
  137. $phpData=" if(!is_array($this->classes))$this->classes=array();
  138. ksort($this->classes);
  139. $phpData.=" return ".var_export( $this->classes,true).";";
  140. file_put_contents($this->cacheFile, $phpData,LOCK_EX);
  141. clearstatcache();
  142. }
  143. /**
  144. * 掃描資料夾以及檔案
  145. * 只有 $this->option['suffix'] 命名的檔案才會被掃描到
  146. * @param $dir
  147. * @return
  148. */
  149. 乾燥函數scanDir($dir){
  150. $files=scandir($dir,1);
  151. foreach($files as $fileName){
  152. $file=rtrim( $dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$fileName;
  153. if(is_dir($file) && strpos($fileName,'.')!==0){
  154. $this- >scanDir($file);
  155. }else{
  156. if($this->str_endWith($fileName,$this->option['suffix'])){
  157. preg_match_all('~ ^s*(?:abstracts+|finals+) ?(?:class|interface)s+(w+)~mi', file_get_contents($file), $classes);
  158. foreach ($classes[1] as $class) {
  159. $this->classes[ $class] = $file;
  160. }
  161. }
  162. }
  163. }
  164. }
  165. 裸函數目錄($dir ){
  166. return is_dir($dir)或($this->directory(dirname($dir)) 和mkdir($dir, 0777));
  167. }
  168. function str_endWith($ str,$subStr){
  169. return substr( $str, -(strlen($subStr)))==$subStr;
  170. }
  171. }
  172. 複製代碼
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板