TOP-framework/framework/library/Loader.php

98 lines
2.4 KiB
PHP

<?php
namespace top\library;
class Loader
{
private $prefixes = [];
private static $number = 0;
/**
* 注册自动加载
*/
public function register()
{
spl_autoload_register([$this, 'loadClass']);
}
/**
* 添加命名空间映射
* @param string $name
* @param string $path
*/
public function set($name, $path)
{
if (isset($this->prefixes[$name])) {
array_push($this->prefixes[$name], $path);
} else {
$this->prefixes[$name] = [$path];
}
}
/**
* 尝试根据前缀和类名加载文件
* @param string $class
* @return bool
*/
private function loadClass($class)
{
// 首次,将前缀等于当前类名
$prefix = $class;
// 从最后一个反斜杠开始分割前缀与类名
while (($pos = strrpos($prefix, '\\')) !== false) {
// 取出当前位置反斜杠分割的前缀
$prefix = substr($class, 0, $pos + 1);
// 取出分割出的实际类名
$className = substr($class, $pos + 1);
// 尝试去加载文件
$loadFile = $this->loadFile($prefix, $className);
if ($loadFile) {
return true;
}
$prefix = rtrim($prefix, '\\');
}
// 未找到文件
return false;
}
/**
* 加载文件
* @param string $prefix
* @param string $class
* @return bool
*/
private function loadFile($prefix, $class)
{
// echo $class . '<br>';
$prefix = trim($prefix, '\\');
// 如果存在此前缀
if (isset($this->prefixes[$prefix])) {
// 遍历当前前缀下的目录
foreach ($this->prefixes[$prefix] as $key => $value) {
// 拼接文件名
$file = str_replace('\\', '/', $value . $class) . '.php';
/*echo '<br>';
echo $file . '<br>';*/
// 如果文件存在则加载文件
if (is_file($file)) {
require $file;
self::$number++;
return true;
}
}
}
return false;
}
/**
* 内置自动加载器加载的文件数
* @return int
*/
public static function getFileNumber()
{
return self::$number;
}
}