[置顶] 自定义类自动加载类
来源:互联网 发布:linux lvm配置文件 编辑:程序博客网 时间:2024/05/18 06:23
<?phprequire_once 'exception.php';/** * 自动加载类 * */final class AutoloadClass {/** * 类搜索路径 * * @var array */ private static $_class_path = array(); /** * 类搜索规则 * * @var array */ private static $_locate_rules = array(); /** * 添加一个类搜索路径 * * @param string $dir 要添加的搜索路径 */ static function import($dir) { $real_dir = realpath($dir); if ($real_dir) { $dir = rtrim($real_dir, '/\\') . DS; if (!isset(self::$_class_path[$dir])) { self::$_class_path[$dir] = $dir; } } } /** * 载入指定类的定义文件,如果载入失败抛出异常 * * @param string $class_name 要载入的类 * @param boolean $throw_exception 找不到指定类时是否抛出异常 */ static function loadClass($class_name, $throw_exception = true) { if (class_exists($class_name, false) || interface_exists($class_name, false)) return; foreach (self::$_locate_rules as $rule){ $filename = call_user_func($rule,$class_name); if ($filename) break; } // 缺省的类加载规则 if (!$filename) $filename = str_replace('_', DS, $class_name) . '.php'; foreach (self::$_class_path as $dir) { $path = $dir . DS . $filename ; if (is_file($path)) { require $path; if (class_exists($class_name, false) || interface_exists($class_name, false)) { return; } } } if ($throw_exception) { throw new ExpectedClassException($class_name, $filename, file_exists($filename)); } } /** * 添加一个类查找规则回调函数,要求规则匹配成功则返回类路径名称 * * 诸如: modules\contact\controllers\default.php * 失败返回false * * @param callback $callback */ static function addLocateRule($callback){ if (is_callable($callback)) self::$_locate_rules[] = $callback; } /** * 用于 的类自动载入,不需要由开发者调用 * * @param string $class_name * @access private */ static function autoload($class_name) { self::loadClass($class_name, true); } /** * 注册或取消注册一个自动类载入方法 * * @param boolean $enabled 启用或禁用该服务 */ static function registerAutoload($enabled = true) { static $registered = false; if (!function_exists('spl_autoload_register')) { exit('spl_autoload does not exist in this PHP installation.'); } $registered = $enabled ? ( $registered ? true : spl_autoload_register(array('AutoloadClass', 'autoload')) ) : !spl_autoload_unregister(array('AutoloadClass', 'autoload')); } /** * 按照 命名规则,搜索文件 * * 命名规则就是文件名中的“_”替换为目录分隔符。 * * @param string $filename * @param boolean $return 指示是否直接返回处理后的文件名,而不判断文件是否存在 * * @return string */ private static function getFilePath($filename, $return = false) { $filename = str_replace('_', DS, $filename); $filename = DS == '/' ? str_replace('\\', DS, $filename) : str_replace('/', DS, $filename); if (strtolower(substr($filename, -4)) != '.php') { $filename .= '.php'; } // 首先搜索当前目录 if (is_file($filename)) { return $filename; } foreach (self::$_class_path as $dir) { $path = $dir . DS . $filename ; if (is_file($path)) { return $path; } } return false; } /** * 载入指定的文件 * * $filename 参数中的 “_” 将被替换为目录 * * @param string $className * @param boolean $loadOnce 指定为 true 时,等同于 require_once * * @return boolean */ static function loadFile($filename, $loadOnce = false) { static $is_loaded = array(); $path = self::getFilePath($filename); if ($path != '') { if (isset($is_loaded[$path]) && $loadOnce) { return true; } $is_loaded[$path] = true; if ($loadOnce) { return require_once($path); } else { return require($path); } } throw new ExpectedFileException($filename); }}
使用demo:
<?php// // 过滤 magic_quotesif (get_magic_quotes_gpc()) {$in = array(& $_GET, & $_POST, & $_COOKIE, & $_REQUEST);while (list($k,$v) = each($in)) {foreach ($v as $key => $val) {if (!is_array($val)) {$in[$k][$key] = stripslashes($val);continue;}$in[] =& $in[$k][$key];}}unset($in);}set_magic_quotes_runtime(0);// 设置自动加载类操作require_once 'autoload.php';AutoloadClass::registerAutoload(true);// 导入应用根路径AutoloadClass::import(App::ini('APP_DIR'));/** * 定位控制器类文件路径 * * @param string $class_name * @return string */function locateControllerFile($class_name){if (!preg_match('/Controller$/i',$class_name))return false;$_ = preg_replace('/Controller$/i','',$class_name);if (empty($_)) return false;$_ = explode('_',$_);$_ = array_map('strtolower', $_);if ($_[0] == 'mod'){// Mod_Contact_DefaultController => modules\contact\controllers\default.php$_[0] = 'modules';$_[1] = $_[1] . '/controllers';}return implode('/',$_) . '.php';}/** * 定位模型类文件路径 * * @param string $class_name * @return string */function locateModelFile($class_name){if (!preg_match('/Model$/i',$class_name))return false;$_ = preg_replace('/Model$/i','',$class_name);if (empty($_)) return false;$_ = explode('_',$_);$_ = array_map('strtolower', $_);if ($_[0] == 'mod'){// Mod_Contact_UserModel => modules\contact\models\user.php$_[0] = 'modules';$_[1] = $_[1] . '/models';}return implode('/',$_) . '.php';}AutoloadClass::addLocateRule('locateControllerFile');AutoloadClass::addLocateRule('locateModelFile');
0 0
- [置顶] 自定义类自动加载类
- 自动加载自定义类
- [置顶]类的加载连接初始化
- thinkphp 自动加载自定义函数库和类库的方法
- thinkPHP3.2.3实现自定义类的自动加载
- 自动加载类
- 类 自动加载对象
- php 自动加载类
- 自动加载类
- PHP自动加载类
- tomcat 类自动加载
- PHP 自动加载类
- PHP 自动加载类
- PHP 类自动加载
- PHP自动加载类
- 自动加载类
- mvc自动加载类
- php自动加载类
- java 开发设计 小游戏 英雄 怪物 武器 关键代码
- [置顶] 修正FLEA_Helper_Pager,让其支持source为sql时的多数据库操作
- 音乐播放记录查询
- [置顶] FLEAPHP 数据库查询 in 的用法
- mapreduce中的压缩
- [置顶] 自定义类自动加载类
- http接口请求参数签名工具类的实现和测试代码
- ListView中getView()的原理
- R 画图之ggplot(1)
- Web 开发工具类(5) | DateUtils
- [置顶] 写个日志封装器....感觉用起来很爽
- vs2013 项目属性配置的总结(主要用于opencv不同版本的管理)
- [置顶] orm 用多了,忽然发觉SQL不会写了... 整个基本的功能重新学习SQL,改自fleaphp
- jsTree的基本使用方法以及按需装载子节点