[关闭]
@Chiang 2020-03-28T20:32:27.000000Z 字数 3973 阅读 572

自动加载引导类文件

doitphp 2020-03


路径数组映射

  1. private static $_coreClassArray = array(
  2. 'Request' => 'core/Request.php',
  3. 'Response' => 'core/Response.php',
  4. 'Model' => 'core/Model.php',
  5. 'DbCommand' => 'core/DbCommand.php',
  6. 'DbPdo' => 'core/DbPdo.php',
  7. 'Log' => 'core/Log.php',
  8. 'DoitException' => 'core/DoitException.php',
  9. 'Widget' => 'core/Widget.php',
  10. 'View' => 'core/View.php',
  11. 'Template' => 'core/Template.php',
  12. 'WidgetTemplate' => 'core/WidgetTemplate.php',
  13. 'Extension' => 'core/Extension.php',
  14. 'Pagination' => 'library/Pagination.php',
  15. 'File' => 'library/File.php',
  16. 'Html' => 'library/Html.php',
  17. 'Cookie' => 'library/Cookie.php',
  18. 'Session' => 'library/Session.php',
  19. 'Image' => 'library/Image.php',
  20. 'Captcha' => 'library/Captcha.php',
  21. 'Curl' => 'library/Curl.php',
  22. 'Client' => 'library/Client.php',
  23. 'Validation' => 'library/Validation.php',
  24. 'FileDownload' => 'library/FileDownload.php',
  25. 'FileUpload' => 'library/FileUpload.php',
  26. 'Excel' => 'library/Excel.php',
  27. 'Csv' => 'library/Csv.php',
  28. 'Security' => 'library/Security.php',
  29. 'Text' => 'library/Text.php',
  30. 'Encrypt' => 'library/Encrypt.php',
  31. 'Tree' => 'library/Tree.php',
  32. 'MongoDb' => 'library/MongoDb.php',
  33. 'Language' => 'library/Language.php',
  34. 'Cache_Memcached' => 'library/cache/Memcached.php',
  35. 'Cache_Memcache' => 'library/cache/Memcache.php',
  36. 'Cache_Redis' => 'library/cache/Redis.php',
  37. 'Cache_File' => 'library/cache/File.php',
  38. 'Pinyin' => 'library/Pinyin.php',
  39. 'Calendar' => 'library/Calendar.php',
  40. 'Benchmark' => 'library/Benchmark.php',
  41. 'HttpResponse' => 'library/HttpResponse.php',
  42. 'Ftp' => 'library/Ftp.php',
  43. );

自动加载类文件方法实现

项目文件的自动加载

  1. public static function loadClass($className) {
  2. //doitPHP核心类文件的加载分析
  3. if (isset(self::$_coreClassArray[$className])) {
  4. //当$className在核心类引导数组中存在时, 加载核心类文件
  5. Doit::loadFile(DOIT_ROOT . DS . self::$_coreClassArray[$className]);
  6. } elseif (substr($className, -10) == 'Controller') {
  7. //controller文件自动载分析
  8. self::_loadTagFile($className, 'Controller');
  9. } elseif (substr($className, -5) == 'Model') {
  10. //modlel文件自动加载分析
  11. self::_loadTagFile($className, 'Model');
  12. } elseif (substr($className, -6) == 'Widget') {
  13. //加载所要运行的widget文件
  14. self::_loadTagFile($className, 'Widget');
  15. } else {
  16. //加载所使用命名空间的类文件
  17. if (strpos($className, '\\') !== false) {
  18. $filePath = BASE_PATH . DS . str_replace('\\', DS, $className) . '.php';
  19. if (!is_file($filePath)) {
  20. //当使用命名空间的文件不存在时,提示错误信息
  21. Response::halt('The File: ' . $filePath .' is not found !');
  22. }
  23. Doit::loadFile($filePath);
  24. return true;
  25. }
  26. //分析加载扩展类文件目录(library)的文件
  27. if (!self::_loadTagFile($className, 'Library')) {
  28. //根据配置文件improt的引导设置,自动加载文件
  29. if (!self::_loadImportConfigFile($className)) {
  30. //最后,当运行上述自动加载规则,均没有加载所需要的文件时,提示错误信息
  31. Response::halt('The Class: ' . $className .' is not found !');
  32. }
  33. }
  34. }
  35. return true;
  36. }
  • 加载核心文件
  • 非核心文件,根据调用类后缀定义名称分类调用
  • 根据命名空间调用
  • 加载扩展类文件
  • 根据配置文件improt的引导设置,自动加载文件

自动加载标签文件

  1. private static function _loadTagFile($className, $tagName) {
  2. //分析标签文件目录路径
  3. switch ($tagName) {
  4. case 'Controller':
  5. $dirName = 'controllers';
  6. //当controller文件存放于子目录时
  7. if (strpos($className, '_') !== false) {
  8. $childDirArray = explode('_', strtolower($className));
  9. $className = ucfirst(array_pop($childDirArray));
  10. $className = implode(DS, $childDirArray) . DS . $className;
  11. }
  12. break;
  13. case 'Model':
  14. $dirName = 'models';
  15. break;
  16. case 'Widget':
  17. $dirName = 'widgets';
  18. break;
  19. case 'Library':
  20. $dirName = 'library';
  21. break;
  22. default:
  23. $dirName = 'library';
  24. }
  25. //分析标签文件的实际路径
  26. $tagFilePath = BASE_PATH . DS . $dirName . DS . str_replace('_', DS, $className) . '.php';
  27. //当标签文件存在时
  28. if (!is_file($tagFilePath)) {
  29. if ($tagName == 'Library') {
  30. return false;
  31. }
  32. //当所要加载的标签文件不存在时,显示错误提示信息
  33. Response::halt('The File: ' . $tagFilePath . ' is not found!');
  34. }
  35. //加载标签文件
  36. Doit::loadFile($tagFilePath);
  37. return true;
  38. }

加载自定义配置文件所引导的文件

  1. private static function _loadImportConfigFile($className) {
  2. //定义自动加载状态。(true:已加载/false:未加载)
  3. $atuoLoadStatus = false;
  4. //分析配置文件import引导信息
  5. $importRules = Configure::get('import');
  6. //当配置文件引导信息合法时
  7. if ($importRules && is_array($importRules)) {
  8. foreach ($importRules as $rules) {
  9. if (!$rules) {
  10. continue;
  11. }
  12. //当配置文件引导信息中含有*'时,将设置的规则中的*替换为所要加载的文件类名
  13. if (strpos($rules, '*') !== false) {
  14. $filePath = str_replace('*', $className, $rules);
  15. } else {
  16. $filePath = $rules . DS . str_replace('_', DS, $className) . '.php';
  17. }
  18. //当自定义自动加载的文件存在时
  19. if (is_file($filePath)) {
  20. //加载文件
  21. Doit::loadFile($filePath);
  22. $atuoLoadStatus = true;
  23. break;
  24. }
  25. }
  26. }
  27. return $atuoLoadStatus;
  28. }

根据全局配置文件中 import 定义规则加载文件

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注