自动加载实现桥接模式-命名空间的引入

自动加载规范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('小明','回家吃饭了');

详情

发布了46 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tangqing24680/article/details/100122648