Import.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace Qii\Autoloader;
  3. class Import
  4. {
  5. const VERSION = '1.3';
  6. private static $loadedFiles = array();
  7. private static $includeFiles = array();
  8. /**
  9. * require文件
  10. *
  11. * @param string $file 需要require的文件
  12. * @return array|bool|void
  13. */
  14. public static function requires($file)
  15. {
  16. if (is_array($file)) {
  17. return array_map(function ($n) {
  18. return self::requires($n);
  19. }, $file);
  20. }
  21. $file = str_replace(DS . DS , DS, str_replace(array('\\', '/'), DS, $file));
  22. if (self::getFileLoaded($file)) return true;
  23. if (file_exists($file)) {
  24. self::setFileLoaded($file);
  25. require $file;
  26. return true;
  27. }
  28. return false;
  29. }
  30. /**
  31. * 包含文件
  32. * @param string $file 文件路径
  33. * @return mix
  34. */
  35. public static function includes($file)
  36. {
  37. if (is_array($file)) {
  38. return array_map(function ($n) {
  39. return self::includes($n);
  40. }, $file);
  41. }
  42. $file = str_replace(array('\\', '/'), DS, $file);
  43. if (self::getIncludeFiles($file) !== null) self::getIncludeFiles($file);
  44. if (file_exists($file)) {
  45. $configure = include($file);
  46. self::setIncludeFiles($file, $configure);
  47. return $configure;
  48. }else{
  49. //print_r(debug_backtrace());
  50. throw new \Qii\Exceptions\FileNotFound(\Qii::i(1405, $file), 404);
  51. }
  52. return false;
  53. }
  54. /**
  55. * 根据类名载入文件
  56. *
  57. * @param string $className 类名
  58. * @return string
  59. */
  60. public static function requireByClass($className)
  61. {
  62. return \Qii\Autoloader\Psr4::getInstance()->loadFileByClass($className);
  63. }
  64. /**
  65. * 载入文件夹中所有文件
  66. *
  67. * @param string $dir 目录
  68. * @throws Qii\Exceptions\FileNotFound
  69. */
  70. public static function requireByDir($dir)
  71. {
  72. if (!is_dir($dir)) throw new \Qii\Exceptions\FileNotFound(\Qii::i(1405, $dir), 404);
  73. $files = self::findFiles($dir, array('php'));
  74. if (isset($files['php'])) self::requires($files['php']);
  75. }
  76. /**
  77. * 设置文件到加载列表
  78. *
  79. * @param string $file 文件
  80. */
  81. public static function setFileLoaded($file)
  82. {
  83. self::$loadedFiles[$file] = true;
  84. }
  85. /**
  86. * 获取指定文件是否已经加载
  87. * @param string $file 文件路径
  88. * @return null
  89. */
  90. public static function getFileLoaded($file)
  91. {
  92. if (isset(self::$loadedFiles[$file])) return self::$loadedFiles[$file];
  93. return false;
  94. }
  95. /**
  96. * 设置include的文件到已经加载列表
  97. *
  98. * @param string $file 文件路径
  99. */
  100. public static function setIncludeFiles($file, $config)
  101. {
  102. self::$includeFiles[$file] = $config;
  103. }
  104. /**
  105. * 获取指定文件是否已经加载
  106. *
  107. * @param string $file 文件路径
  108. * @return bool
  109. */
  110. public static function getIncludeFiles($file)
  111. {
  112. if (isset(self::$includeFiles[$file])) {
  113. return self::$includeFiles[$file];
  114. }
  115. return false;
  116. }
  117. /**
  118. * 获取已经require及include的文件列表
  119. *
  120. * @return array
  121. */
  122. public static function getLoadedFile()
  123. {
  124. return array('include' => self::$includeFiles, 'requires' => self::$loadedFiles);
  125. }
  126. /**
  127. * 遍历目录中的路径
  128. * @param string $directory 目录
  129. * @param array $directories 目录下所有的路径
  130. */
  131. public static function globRecursive($directory, &$directories = array())
  132. {
  133. foreach (glob($directory, GLOB_ONLYDIR | GLOB_NOSORT) as $folder) {
  134. $directories[] = $folder;
  135. self::globRecursive("{$folder}/*", $directories);
  136. }
  137. }
  138. /**
  139. * 返回指定目录中的文件
  140. * @param string $directory 目录
  141. * @param array $extensions 需要过滤的后缀名
  142. * @return array
  143. */
  144. public static function findFiles($directory, $extensions = array())
  145. {
  146. self::globRecursive($directory, $directories);
  147. $files = array();
  148. foreach ($directories as $directory) {
  149. if (count($extensions) == 0) {
  150. foreach (glob("{$directory}/*.*") as $file) {
  151. $files[] = $file;
  152. }
  153. } else {
  154. foreach ($extensions as $extension) {
  155. foreach (glob("{$directory}/*.{$extension}") as $file) {
  156. $files[$extension][] = $file;
  157. }
  158. }
  159. }
  160. }
  161. return $files;
  162. }
  163. }