rare にはクラス自動ロード機能が組み込まれており、クラスを使用する場合、クラスファイルを必要とせずに直接使用できます。 このタイプの自動読み込み関数は非常に独立しており、必要に応じて他のフレームワーク (任意の PHP プログラム) で直接使用できます。 1 まず、rareAutoLoad.class.php 2.Registration 関数を紹介します
- /**
- * クラスの自動読み込み
- * 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 ファイルを手動で許可する必要があります
- * );
- * rareAutoLoad::register($option);
- *
- * symfony クラスを参照します 自動ロード
- * 効率を高めるために、クラスの場所はキャッシュ ファイルに保存され、初めて使用するときに dirs 内のファイル ディレクトリがスキャンされます
- * クラスのファイル命名要件たとえば、ファイル名 a.class.php で定義されたクラスはスキャンされ、ファイル a.php は無視されます
- * クラス間には関係はありません。たとえば、クラス b は a.class.php ファイルで定義できます。*/
- 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: スキャン ディレクトリ キャッシュ: キャッシュ ファイルが必要です
- */
- 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['キャッシュ'] );
- }
- if(isset($option['hand']))$this->hand=(boolean)$option['hand'];
- $this->cacheFile=$option[ 'キャッシュ' ].".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 例外
- */
- 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(sprintf('%s::autoload をオートロード メソッドとして登録できません。', get_class(self::getInstance())));
- }
- self::$registered = true;
- }
-
- / **
- * spl_autoload_call はロードクラスを呼び出します
- * キャッシュファイル内のクラスのパスが間違っている場合は、一度リロードを試みます
- * リロード後に存在しないクラスのキーを記録し、複数のロードを避けるために false としてマークしますキャッシュファイルの無効化 Update
- * class_exists を判定に使用する場合、デフォルトでオートロード動作が行われます
- * @param $class
- * @return
- */
- public function autoload($class){
- if(class_exists($class, false) ||interface_exists($class, false)) return true;
- if ($this->クラス && isset ($this->gt;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->gt;classes[$class])){
- $file=$this->classes[$class];
- if(!$file) return false;
- require($file);
- return true;
- }else{
- $this->gt;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();
- }
-
- /**
- * 再度再スキャン
- * クラス名の位置情報をキャッシュに保存
- * @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 as $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] as $class){
- $this ->classes[$class] = $file;
- }
- }
- }
- }
- }
-
- private function directory($dir){
- return is_dir($dir) or ($this->directory(dirname( $dir)) および mkdir($dir, 0777));
- }
-
- function str_endWith($str,$subStr){
- return substr($str, -(strlen($subStr)))==$subStr;
- }
- }
-
复制幣
|