provider/core/app/AppAutoLoader.php (76 lines of code) (raw):

<?php /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace com\fenqile\fsof\provider\core\app; class AppAutoLoader { private static $root_path = array(); private static $class_autoload_path = array(); /** * [set_include_path 完成根目录下目录的扫描,支持多层目录嵌套] * @param [type] $dir [路径] * @return array */ private static function set_include_path($dir) { $include_paths = array(); $include_paths[] = $dir; //读取所有的文件夹目录 $arr = scandir($dir); $len = count($arr); for ($i=0; $i < $len; $i++) { //.和..去掉 if (('.' == $arr[$i]) || ('..' == $arr[$i])) { continue; } if(is_dir($dir.DIRECTORY_SEPARATOR.$arr[$i])) { $include_paths = array_merge($include_paths, self::set_include_path($dir.DIRECTORY_SEPARATOR.$arr[$i])); } } return array_unique($include_paths); } /** * [auto_load] * @param [type] $className [文件名] * @return [type] [description] */ public static function auto_load($className) { $newClassName = str_replace('\\', DIRECTORY_SEPARATOR, trim($className, '\\')); foreach (self::$class_autoload_path as $key => $path) { $class_file = $path.DIRECTORY_SEPARATOR.$newClassName.".php"; if (is_file($class_file)) { require_once($class_file); break; } } } /** * [setRoot 设置root根目录,可以同时添加多个] * @param array $root [array] */ public static function setRoot($rootArr = array()) { if(is_array($rootArr)) { self::$root_path = array_merge(self::$root_path, $rootArr); foreach (self::$root_path as $key => $value) { self::$class_autoload_path = array_merge(self::$class_autoload_path,self::set_include_path($value)); } } } /** * [addRoot 添加root节点,可以多节点实现auto_load] * @param [type] $root [description] */ public static function addRoot($root) { \Logger::getLogger(__CLASS__)->debug('addRoot() in '.$root); if(isset($root)) { self::$root_path[] = $root; foreach (self::$root_path as $key => $value) { self::$class_autoload_path = array_merge(self::$class_autoload_path,self::set_include_path($value)); } } \Logger::getLogger(__CLASS__)->debug('addRoot() out '.print_r(self::$class_autoload_path, true)); } /** * [getFatherPath 获取父级目录路径] * @param [type] $path [description] * @param integer $num [父级的级数,默认是当前目录的上一级目录] * @return [type] [路径字符串] */ public static function getFatherPath($path, $num = 1) { if (empty($path)) { return ""; } for ($i = 0; $i < $num; $i++) { $path = substr($path,0,strrpos($path ,DIRECTORY_SEPARATOR)); } return $path; } } spl_autoload_register(array(__NAMESPACE__ . '\AppAutoLoader','auto_load'));