<?php

/**
 * 自动加载类
 * 
 * @author KevinXie
 * 
 * @time 2015/08/22
 */
final class Lib_Autoload
{
	protected static $paths = array( 
			'Model'		=>	PATH_MOD,
			'Lib'		=>	PATH_LIB,
			'Lang'		=>	PATH_LNG,
//			'Scrontab'	=>	PATH_SWOOLE_CRONTAB,
			'Crontab'	=>	PATH_CRO,
//			'Swoole'	=>	PATH_SWOOLE,
//			'Logic'		=>	PATH_LOGIC,
//			'Crontabs'	=>	PATH_CRO_SWOOLE,
	);
	
	protected static $files		= array();
	public    static $ext		= '.php';
	protected static $init		= FALSE;
	protected static $_instance	= array();
	
	/**
	 * 初始化
	 * 
	 * @return 
	 */
	public static function init()
	{
		if(self::$init)
		{
			return ;
		}
		self::$init = TRUE;
	
		spl_autoload_register(array('Lib_Autoload', 'autoloadClass'));
		return ;
	}
	/**
	 * 类自动加载器
	 * 
	 * @param unknown $class 类名
	 * @return boolean
	 */
	public static function autoloadClass( $class)
	{
		$pos  = strrpos( $class, '_');
		if( $pos > 0)
		{
			$dir 	= substr( $class, 0, $pos);
			$file 	= substr( $class, $pos + 1);
		}
		else
		{
			if ( version_compare( PHP_VERSION, '5.4.0', '<')) 
			{
				throw new Exception('The Facebook SDK v4 requires PHP version 5.4 or higher.');
			}
			
			$prefix = 'Facebook\\';
			$len = strlen( $prefix);
			if ( strncmp( $prefix, $class, $len) === 0) 
			{
				$base_dir = defined('FACEBOOK_SDK_V4_SRC_DIR') ? FACEBOOK_SDK_V4_SRC_DIR : PATH_LIB.'Facebook/';
				$relative_class = substr( $class, $len);
				$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
				if ( file_exists( $file))//文件存在就加载文件 
				{
					require( $file);
					return true;
				}
			}
			return FALSE;
		}
		
		$file = strtolower( $file);
		$file = str_replace( '_', '.', strtolower( $class));
		
		if( $file = Lib_Autoload::findFile( $dir, $file))
		{
			require($file);
			return true;
		}
		return FALSE;
	}
	/**
	 * 查找文件
	 * 
	 * @param string $dir	目录名
	 * @param string $file 	文件名
	 * @param string $ext 	扩展名
	 * @return Ambigous <boolean, string> 成功返回文件路径，失败返回FALSE
	 */
	 public static function findFile( $dir, $file, $ext=NULL)
	 {
		$ext = $ext ? ".{$ext}" : Lib_Autoload::$ext;

		$path = Lib_Autoload::$paths[$dir];
		if ( $path == false) 
		{
			return false;
		}
		$filePath = $path . $file . $ext;

		$key = md5($filePath);
		
		if( isset( Lib_Autoload::$files[$key]))
		{
			return Lib_Autoload::$files[$key];
		}
		
		if( is_file( $filePath))
		{
			Lib_Autoload::$files[$key] = $filePath;
			return $filePath;
		}
		//日志记录没有相关文件和CLASS
		
		return false;
	}
}//end class