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(); * */ Autoload::home(__DIR__)->register()->load('Debug');// Debug类中有几个函数,函数不会自动加载,所以这里手动加载 Debug类 Autoload::home('/e/develop/php/dev/')->register(); 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, '\\'); self::$file = ''; if(empty($this->match) || strpos($class, $this->match) === 0){ self::$file = strtr($this->home . '/' . $class, '\\', '/') . $this->suffix; } return $this; } /** * 手动加载 * @param $class */ public function load(string $class): string { if(!empty($class)) $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应用必不可少的技术
2019-04-17 Redis 笔记