自动加载规范PSR-4
- 类泛指:类,接口,抽象类,trait等可复用的代码
- 命名空间:
\顶级命名空间\子命名空间(可以有多个子命名空间)\完整类名
- psr-4规定必须有一个如上说的顶级命名空间,表示一个特殊的文件目录。
- 类名可以大小写(建议统一大写)
- 一个文件中只有一个类
- 方便测试:下面 A 目录表示:项目根目录
自动加载核心代码
#目录:A/vendor/Loader.php
class Loader
{
//路径映射
public static $vendorMap = [
'App' => __DIR__ . DIRECTORY_SEPARATOR . '..\App',//dirname(__FILE__).DIRECTORY_SEPARATOR.'..\App';
'Contract' => __DIR__ . DIRECTORY_SEPARATOR . '..\Contract',
];
/**
* 自动加载器
*
* @param $class
*/
public static function autoload($class)
{
$file = self::findFile($class);
if (file_exists($file)) {
self::includeFile($file);
}
}
/**
* @param $class
* 解析文件路径
*
* @return string
*/
private static function findFile($class)
{
$vendor = substr($class, 0, strpos($class, '\\')); // 顶级命名空间
$vendorDir = self::$vendorMap[$vendor]; // 文件基目录
var_dump($vendorDir);
$filePath = substr($class, strlen($vendor)) . '.php'; // 文件相对路径
return strtr($vendorDir . $filePath, '\\', DIRECTORY_SEPARATOR); // 文件标准路径
}
/**
* 引入文件
*
* @param $file
*/
private static function includeFile($file)
{
if (is_file($file)) {
include $file;
}
}
}
契约接口
#目录:A/Contract/Send.php
namespace Contract;
/**
* 定义发送工具接口
*/
interface Send
{
/**
* @param $to 发送地址
* @param $content 发送内容
*/
public function send($to,$content);
}
#目录:A/Contract/Info.php
namespace Contract;
/**
* 定义发送信息类别:普通、紧急、加急等
*/
interface Info
{
/**
* @param $to 发送地址
* @param $content 发送内容
*/
public function msg($to,$content);
}
#目录:A/App/CommonInfo.php
namespace App;
use Contract\Info;
use Contract\Send;
//实现发送紧急程度--普通消息
class CommonInfo implements Info
{
private $tool = null;
public function __construct(Send $send)
{
$this->tool = $send;
}
public function msg($to, $content)
{
$new_content = '【普通消息】' . $content;
return $this->tool->send($to, $new_content);
}
}
#目录:A/App/Zn.php
namespace App;
use Contract\Send;
//实现发送工具--站内消息发送工具
class Zn implements Send
{
public function send($to, $content)
{
return '【站内消息】发送给:' . $to . '|发送内容:' . $content;
}
}
测试代码
//引入自动加载核心代码
include 'vendor/Loader.php';
//自动调用
spl_autoload_register('Loader::autoload');
use \App\CommonInfo;
use \App\Zn;
$send=new CommonInfo(new Zn());
echo $send->msg('小明','回家吃饭了');
详情
- https://flc.io/php/psr/psr-4-examples/
- https://www.cnblogs.com/woider/p/6443854.html