Import.php 4.4 KB

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