blob: 14a983ad3160216938b916298b9526b38edc2342 [file] [log] [blame]
<?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'));