>  기사  >  백엔드 개발  >  PHP 클래스 자동 로딩

PHP 클래스 자동 로딩

WBOY
WBOY원래의
2016-07-25 09:09:471045검색

rare에는 클래스 자동 로딩 기능이 내장되어 있어 클래스 사용 시 클래스 파일을 요구(포함)하지 않고 바로 사용할 수 있습니다.

이러한 유형의 자동 로딩 기능은 매우 독립적입니다. 필요한 경우 다른 프레임워크(모든 PHP 프로그램)에서 직접 사용할 수 있습니다.

1 먼저 rareAutoLoad.class.php를 소개합니다

2.등록 기능

  1. /**
  2. * 클래스 자동 로딩
  3. * http://raremvc.googlecode.com
  4. * http://rare.hongtao3.com
  5. * @example
  6. * include 'rareAutoLoad.php'; 🎜> * $option=array('dirs'=>'/www/lib/share/,/www/lib/api/',//class 해당 디렉토리에서 검색
  7. * 'cache'=> ;' /tmp/111111.php',//클래스 경로 캐시 파일
  8. * 'suffix'=>'.class.php' //자동 클래스 로딩이 필요한 PHP 클래스 파일의 접미사
  9. * "hand "=>true, //클래스 경로 파일을 수동으로 업데이트할지 여부, false인 경우 지정된 캐시 파일에 캐시 파일을 씁니다.
  10. * //true인 경우 수동으로 허용해야 합니다. autoLoad.php 파일
  11. * ; 한 번 사용하면 dirs의 파일 디렉터리를 검사합니다.
  12. * 자동으로 로드해야 하는 클래스의 파일 이름 지정 요구 사항은 .class.php로 끝나야 합니다. 파일 이름 a.class.php에 정의된 클래스는 다음과 같습니다. 스캔된 a.php 파일은 무시됩니다.
  13. * 클래스 이름 및 파일 이름 지정은 필요하지 않습니다. 예를 들어 클래스 b{}
  14. *
  15. * @author duwei
  16. *
  17. 에 정의할 수 있습니다.*/
  18. class rareAutoLoad
  19. {
  20. private static $instance=null;
  21. private static $registered=false;
  22. private $cacheFile=null;
  23. private $classes=array();//해당 클래스 클래스 이름 및 해당 파일 경로
  24. private $option;
  25. private $hand=false;//클래스 경로 스캔을 위해 스크립트를 수동으로 실행할지 여부,
  26. private $reloadCount=0;//다시 로드 작업 횟수
  27. /**
  28. * @param array $option에는 매개변수 dirs: 디렉터리 검색 캐시: 캐시 파일이 필요합니다.
  29. */
  30. 공개 함수 __construct($option){
  31. if(!isset($option['suffix'])) $option['suffix']=".class.php";//파일 접미사
  32. $this->option=$option;
  33. if(!isset($option['cache'])){
  34. $trac=debug_backtrace(false);
  35. $calFile=$trac [2 ]['file'];
  36. $option['cache']="/tmp/rareautoLoad_".md5($calFile)."_".filemtime($calFile);
  37. @unlink($ option[ 'cache']);
  38. }
  39. if(isset($option['hand']))$this->hand=(boolean)$option['hand'];
  40. $ this- >cacheFile=$option['cache'].".php";
  41. $this->getClasses();
  42. }
  43. /**
  44. * DAutoLoad의 단일 인스턴스 객체 가져오기
  45. * @param array $option
  46. * @return DAutoLoad
  47. */
  48. 개인 정적 함수 getInstance($option){
  49. if (!isset(self::$instance)){
  50. self::$instance = new rareAutoLoad($option);
  51. }
  52. return self ::$instance;
  53. }
  54. /**
  55. * 자동 로딩 등록
  56. * @param array $option array('dirs'=>'/www/lib/share/,/www/lib/api/','cache'=>' / tmp/111111.php');
  57. * @throws 예외
  58. */
  59. 공개 정적 함수 레지스터($option) {
  60. if (self::$registered)return;
  61. // ini_set('unserialize_callback_func', 'spl_autoload_call');
  62. if (false === spl_autoload_register(array(self::getInstance($option), 'autoload'))){
  63. die( sprintf( '%s::autoload를 자동 로딩 방법으로 등록할 수 없습니다.', get_class(self::getInstance())));
  64. }
  65. self::$registered = true;
  66. }
  67. /**
  68. * spl_autoload_call은 load class를 호출합니다.
  69. * 캐시 파일에 있는 클래스의 경로가 올바르지 않으면 한 번 reload를 시도합니다.
  70. * reload 후 존재하지 않는 클래스의 캐시에 키를 기록합니다. , false로 표시하고 캐시된 파일의 여러 잘못된 업데이트 방지
  71. * class_exists를 사용하여 판단할 때 기본적으로 자동 로드 작업이 수행됩니다.
  72. * @param $class
  73. * @return
  74. */
  75. 공용 함수 autoload($class){
  76. if(class_exists($class, false) || 인터페이스_exists($class, false)) return true;
  77. if ($this->classes && isset($this->classes[$class]) ){
  78. $file=$this->classes[$class];
  79. if(!$ file) return false;
  80. if(!file_exists($file) && !$this->hand){
  81. $this->reload();
  82. return $this->autoload($ class) ;
  83. }
  84. require($file);
  85. return true;
  86. }{
  87. $this->reload();
  88. if(isset($this-> ;classes [$class])){
  89. $file=$this->classes[$class];
  90. if(!$file)return false;
  91. require($file);
  92. true를 반환합니다.
  93. }else{
  94. $this->classes[$class]=false;
  95. $this->saveCache();
  96. }
  97. }
  98. false를 반환합니다. ;
  99. }
  100. /**
  101. * 클래스 이름 목록 가져오기
  102. * @return
  103. */
  104. 비공개 함수 getClasses(){
  105. if(file_exists($this->cacheFile)){
  106. $this->classes=require($this ->cacheFile);
  107. if(is_array($this->classes))return true;
  108. }
  109. $this->classes=array();
  110. $this-> reload();
  111. }
  112. /**
  113. * 다시 스캔
  114. * 클래스 이름의 위치 정보를 캐시에 저장
  115. * @return
  116. */
  117. 개인 함수 reload(){
  118. $this->reloadCount ;
  119. if($this-> ;hand)return;
  120. $cachedir=dirname($this->cacheFile);
  121. $this->directory($cachedir);
  122. if(!is_writable($cachedir)) die(' 캐시를 쓸 수 없습니다!');
  123. settype($this->classes, 'array');
  124. $dirs=$this->option['dirs'];
  125. if(!is_array($dirs)) $dirs=explode(",", $dirs);
  126. $dirs=array_unique($dirs);
  127. foreach($dirs를 $dir로) {
  128. if(!$dir || !file_exists($dir))continue;
  129. $this->scanDir($dir);
  130. }
  131. $this->saveCache();
  132. }
  133. 비공개 함수 saveCache(){
  134. if($this->hand)return;
  135. $phpData=" if(!is_array($this->classes))$this->classes=array();
  136. ksort($this->classes);
  137. $phpData.=" return ".var_export($this->classes,true).";";
  138. file_put_contents($this->cacheFile, $phpData,LOCK_EX);
  139. clearstatcache();
  140. }
  141. /**
  142. * 폴더 및 파일 검사
  143. * $this->option['suffix']로 명명된 파일만 검사됩니다.
  144. * @param $dir
  145. * @return
  146. */
  147. 비공개 함수 scanDir($dir){
  148. $files=scandir($dir,1);
  149. foreach($files as $fileName){
  150. $file=rtrim($dir,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$fileName;
  151. if(is_dir($file) && strpos($fileName,'.')!==0){
  152. $this- >scanDir($file);
  153. }else{
  154. if($this->str_endWith($fileName,$this->option['suffix'])){
  155. preg_match_all('~ ^s*(?:abstracts |finals )?(?:class|interface)s (w )~mi', file_get_contents($file), $classes);
  156. foreach ($classes[1]를 $class로) {
  157. $this->classes[$class] = $file;
  158. }
  159. }
  160. }
  161. }
  162. }
  163. 개인 함수 디렉터리($dir ){
  164. return is_dir($dir) 또는 ($this->directory(dirname($dir)) 및 mkdir($dir, 0777));
  165. }
  166. function str_endWith($ str,$subStr){
  167. return substr($str, -(strlen($subStr)))==$subStr;
  168. }
  169. }
复제代码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.