rare에는 클래스 자동 로딩 기능이 내장되어 있어 클래스 사용 시 클래스 파일을 요구(포함)하지 않고 바로 사용할 수 있습니다. 이러한 유형의 자동 로딩 기능은 매우 독립적입니다. 필요한 경우 다른 프레임워크(모든 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',//클래스 경로 캐시 파일
- * 'suffix'=>'.class.php' //자동 클래스 로딩이 필요한 PHP 클래스 파일의 접미사
- * "hand "=>true, //클래스 경로 파일을 수동으로 업데이트할지 여부, false인 경우 지정된 캐시 파일에 캐시 파일을 씁니다.
- * //true인 경우 수동으로 허용해야 합니다. autoLoad.php 파일
- * ; 한 번 사용하면 dirs의 파일 디렉터리를 검사합니다.
- * 자동으로 로드해야 하는 클래스의 파일 이름 지정 요구 사항은 .class.php로 끝나야 합니다. 파일 이름 a.class.php에 정의된 클래스는 다음과 같습니다. 스캔된 a.php 파일은 무시됩니다.
- * 클래스 이름 및 파일 이름 지정은 필요하지 않습니다. 예를 들어 클래스 b{}
- *
- * @author duwei
- *
- 에 정의할 수 있습니다.*/
- class rareAutoLoad
- {
- private static $instance=null;
- private static $registered=false;
-
- private $cacheFile=null;
- private $classes=array();//해당 클래스 클래스 이름 및 해당 파일 경로
- private $option;
-
- private $hand=false;//클래스 경로 스캔을 위해 스크립트를 수동으로 실행할지 여부,
-
- private $reloadCount=0;//다시 로드 작업 횟수
- /**
- * @param array $option에는 매개변수 dirs: 디렉터리 검색 캐시: 캐시 파일이 필요합니다.
- */
- 공개 함수 __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
- */
- 개인 정적 함수 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 예외
- */
- 공개 정적 함수 레지스터($option) {
- if (self::$registered)return;
- // ini_set('unserialize_callback_func', 'spl_autoload_call');
- if (false === spl_autoload_register(array(self::getInstance($option), 'autoload'))){
- die( sprintf( '%s::autoload를 자동 로딩 방법으로 등록할 수 없습니다.', get_class(self::getInstance())));
- }
- self::$registered = true;
- }
-
- /**
- * spl_autoload_call은 load class를 호출합니다.
- * 캐시 파일에 있는 클래스의 경로가 올바르지 않으면 한 번 reload를 시도합니다.
- * reload 후 존재하지 않는 클래스의 캐시에 키를 기록합니다. , false로 표시하고 캐시된 파일의 여러 잘못된 업데이트 방지
- * class_exists를 사용하여 판단할 때 기본적으로 자동 로드 작업이 수행됩니다.
- * @param $class
- * @return
- */
- 공용 함수 autoload($class){
- if(class_exists($class, false) || 인터페이스_exists($class, false)) return true;
- if ($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);
- true를 반환합니다.
- }else{
- $this->classes[$class]=false;
- $this->saveCache();
- }
- }
- 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();
- }
-
- /**
- * 다시 스캔
- * 클래스 이름의 위치 정보를 캐시에 저장
- * @return
- */
- 개인 함수 reload(){
- $this->reloadCount ;
- if($this-> ;hand)return;
- $cachedir=dirname($this->cacheFile);
- $this->directory($cachedir);
- if(!is_writable($cachedir)) die(' 캐시를 쓸 수 없습니다!');
-
- settype($this->classes, 'array');
-
- $dirs=$this->option['dirs'];
- if(!is_array($dirs)) $dirs=explode(",", $dirs);
-
- $dirs=array_unique($dirs);
- foreach($dirs를 $dir로) {
- if(!$dir || !file_exists($dir))continue;
- $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]를 $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;
- }
- }
-
复제代码
|