PHP 自动加载类
<?php
/**
* 自动加载类文件
* author: zbseoag
* 示例:
*
* //自动加载类名以'Model' 开头的类, 加载:./lib/Model/*.class.php 文件
* Autoload::home('./lib/')
* ->match('\Model') //匹配以 \Model 开头的类
* ->suffix('class.php') //类文件名后缀
* ->register() //注册到加载函数
*
* $user = new \Model\User(); //实例化一个对象
* echo Autoload::$file; //输出被加载类文件路径
*
* //注册并加载一个类
* Autoload::home(__DIR__)->register()->load('Mysql');
* echo Autoload::$file; //输出被加载类文件路径
*
* //仅仅生成文件路径
* echo Autoload::home(__DIR__)->suffix('class.php')->make('Mysql');
*
* //输出加载失败的文件
* echo Autoload::error();
*
*/
class Autoload {
public $home = '.';
public $match = '';
public $suffix = 'php';
public static $file = '';
public static $error = [];
private function __construct($home = '.') {
//删除后边斜杠
$this->home = rtrim($home, '\\/');
}
/**
* 根目录
* @param $value
* @return $this
*/
public static function home($value = '') {
return new static($value);
}
/**
* 匹配命名空间
* @param $value
* @return $this
*/
public function match($value) {
$this->match = trim($value, '/');
return $this;
}
/**
* 类名文件后缀,如 'class.php'
* @param $value
* @return $this
*/
public function suffix($value) {
$this->suffix = ltrim($value, '.');
return $this;
}
public function register() {
spl_autoload_register(function($class) {
$this->load($class);
});
return $this;
}
/**
* 生成文件路径
* @param $class
* @return string
*/
public function make($class) {
//删除类名两边的斜杠 \
$class = trim($class, '\\');
$file = '';
if(empty($this->match) || strpos($class, $this->match) === 0){
if($this->match){
$class = ltrim($class, $this->match);
}
$file = strtr($this->home . '/' . $class, '\\', '/') . '.' . $this->suffix;
}
return $file;
}
/**
* 手动加载
* @param $class
*/
public function load($class) {
if(!empty($class)) self::$file = $this->make($class);
if(is_file(self::$file)){
require_once self::$file;
}else{
self::$error[] = self::$file;
}
return self::$file;
}
/**
* 动态创建对象
* @param $class
* @param $arguments
* @return object
* @throws ReflectionException
*/
public static function create($class, $arguments) {
$class = new \ReflectionClass($class);
return $class->newInstanceArgs($arguments);
}
public static function error() {
return print_r(self::$error, true);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术