ホームページ  >  記事  >  バックエンド開発  >  PHPクラスの自動読み込み

PHPクラスの自動読み込み

WBOY
WBOYオリジナル
2016-07-25 09:09:471044ブラウズ

rare にはクラス自動ロード機能が組み込まれており、クラスを使用する場合、クラスファイルを必要とせずに直接使用できます。

このタイプの自動読み込み関数は非常に独立しており、必要に応じて他のフレームワーク (任意の PHP プログラム) で直接使用できます。

1 まず、rareAutoLoad.class.php

2.Registration 関数を紹介します

  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',//クラスパス キャッシュファイル
  9. * 'suffix'=>'.class.php' //自動クラスローディングを必要とするPHPクラスファイルのサフィックス
  10. * "hand"=>true, //クラスパスファイルを手動で更新するかどうかfalse です キャッシュ ファイルは指定されたキャッシュ ファイルに書き込まれます
  11. * //true の場合、autoLoad.php ファイルを手動で許可する必要があります
  12. * );
  13. * rareAutoLoad::register($option);
  14. *
  15. * symfony クラスを参照します 自動ロード
  16. * 効率を高めるために、クラスの場所はキャッシュ ファイルに保存され、初めて使用するときに dirs 内のファイル ディレクトリがスキャンされます
  17. * クラスのファイル命名要件たとえば、ファイル名 a.class.php で定義されたクラスはスキャンされ、ファイル a.php は無視されます
  18. * クラス間には関係はありません。たとえば、クラス b は a.class.php ファイルで定義できます。*/
  19. class rareAutoLoad
  20. {
  21. private static $instance=null;
  22. private static $registered=false;
  23. private $cacheFile=null;
  24. private $classes =array();//対応するクラスのクラス名と対応するファイルパス
  25. private $option;
  26. private $hand=false;//クラスパスをスキャンするスクリプトを手動で実行するかどうか、
  27. private $reloadCount=0; //リロード オペレーションの数
  28. /**
  29. * @param array $option にはパラメータ dirs: スキャン ディレクトリ キャッシュ: キャッシュ ファイルが必要です
  30. */
  31. public function __construct($option){
  32. if(!isset($option['suffix'])) $option['suffix']=。 class.php ";//ファイルサフィックス
  33. $this->option=$option;
  34. if(!isset($option['cache'])){
  35. $trac=debug_backtrace(false);
  36. $calFile=$ trac[2 ]['file'];
  37. $option['cache']="/tmp/rareautoLoad_".md5($calFile)."_".filemtime($calFile);
  38. @unlink($option['キャッシュ'] );
  39. }
  40. if(isset($option['hand']))$this->hand=(boolean)$option['hand'];
  41. $this->cacheFile=$option[ 'キャッシュ' ].".php";
  42. $this->getClasses();
  43. }
  44. /**
  45. * DAutoLoad の単一インスタンス オブジェクトを取得します
  46. * @param array $option
  47. * @return DAutoLoad
  48. */
  49. プライベート静的関数 getInstance($option){
  50. if (!isset(self: :$instance )){
  51. self::$instance = new rareAutoLoad($option);
  52. }
  53. return self::$instance;
  54. }
  55. /**
  56. * 自動ロードに登録します
  57. * @param array $option array('dirs'=>'/www/lib/share/,/www/lib/api/','cache'=>'/tmp/111111 .php');
  58. * @throws 例外
  59. */
  60. public static function register($option ) {
  61. if (self::$registered)return;
  62. // ini_set('unserialize_callback_func', 'spl_autoload_call');
  63. if (false === spl_autoload_register(array(self::getInstance($option), 'autoload' ))) {
  64. die(sprintf('%s::autoload をオートロード メソッドとして登録できません。', get_class(self::getInstance())));
  65. }
  66. self::$registered = true;
  67. }
  68. / **
  69. * spl_autoload_call はロードクラスを呼び出します
  70. * キャッシュファイル内のクラスのパスが間違っている場合は、一度リロードを試みます
  71. * リロード後に存在しないクラスのキーを記録し、複数のロードを避けるために false としてマークしますキャッシュファイルの無効化 Update
  72. * class_exists を判定に使用する場合、デフォルトでオートロード動作が行われます
  73. * @param $class
  74. * @return
  75. */
  76. public function autoload($class){
  77. if(class_exists($class, false) ||interface_exists($class, false)) return true;
  78. if ($this->クラス && isset ($this->gt;classes[$class]) ){
  79. $file=$this->classes[$class];
  80. if(!$file)return false;
  81. if(!file_exists($file) ) && ! $this->hand){
  82. $this->reload();
  83. return $this->autoload($class);
  84. }
  85. require($file);
  86. return true;
  87. }{
  88. $this ->reload();
  89. if(isset($this->gt;classes[$class])){
  90. $file=$this->classes[$class];
  91. if(!$file) return false;
  92. require($file);
  93. return true;
  94. }else{
  95. $this->gt;classes[$class]=false;
  96. $this->saveCache();
  97. }
  98. }
  99. return false;
  100. }
  101. /**
  102. * クラス名のリストを取得します
  103. * @return
  104. */
  105. プライベート関数 getClasses(){
  106. if(file_exists($this->cacheFile)){
  107. $this->classes=require($this->cacheFile);
  108. if (is_array($this->classes))return true;
  109. }
  110. $this->classes=array();
  111. $this->reload();
  112. }
  113. /**
  114. * 再度再スキャン
  115. * クラス名の位置情報をキャッシュに保存
  116. * @return
  117. */
  118. プライベート関数 reload(){
  119. $this->reloadCount++;
  120. if($this->hand)return;
  121. $cachedir=dirname($this->cacheFile);
  122. $this->directory($ cachedir);
  123. if(!is_writable($cachedir)) die('キャッシュを書き込めません!');
  124. settype($this->classes, 'array');
  125. $dirs=$this-> option['dirs'];
  126. if(!is_array($dirs)) $dirs=explode(",", $dirs);
  127. $dirs=array_unique($dirs);
  128. foreach($dirs as $dir) {
  129. if(!$dir || !file_exists($dir)) continue;
  130. $this->scanDir($dir);
  131. }
  132. $this->saveCache();
  133. }
  134. プライベート関数 saveCache( ){
  135. if($this->hand)return;
  136. $phpData=" if(!is_array($this->classes))$this ->classes=array();
  137. ksort($this->classes);
  138. $phpData.="return ".var_export($this->classes,true).";";
  139. file_put_contents($this ->cacheFile, $phpData,LOCK_EX);
  140. clearstatcache();
  141. }
  142. /**
  143. * フォルダーとファイルをスキャンします
  144. * $this->option['suffix'] で指定されたファイルのみがスキャンされます
  145. * @param $dir
  146. * @return
  147. */
  148. プライベート関数 scanDir($dir){
  149. $files=scandir($dir,1);
  150. foreach($files as $fileName){
  151. $file=rtrim($dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$fileName;
  152. if(is_dir($file) && strpos($fileName,'.')!==0){
  153. $this->scanDir($file);
  154. }else{
  155. if($this->str_endWith($fileName,$this->option['suffix'])){
  156. preg_match_all('~^s *(?:abstracts+|finals+)?(?:class|interface)s+(w+)~mi', file_get_contents($file), $classes);
  157. foreach ($classes[1] as $class){
  158. $this ->classes[$class] = $file;
  159. }
  160. }
  161. }
  162. }
  163. }
  164. private function directory($dir){
  165. return is_dir($dir) or ($this->directory(dirname( $dir)) および mkdir($dir, 0777));
  166. }
  167. function str_endWith($str,$subStr){
  168. return substr($str, -(strlen($subStr)))==$subStr;
  169. }
  170. }
复制幣


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。