php psr 4 实例,PSR-4 自动加载 - 案例

2023-10-24 12:50
文章标签 加载 php 实例 自动 案例 psr

本文主要是介绍php psr 4 实例,PSR-4 自动加载 - 案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

da24c7de1d6d

Psr-4-example.jpg

PSR-4 的实现示例

下面的实例描述了符合 PSR-4 的代码:

闭包实例(Closure Example)

/**

* 一个特定项目的实现的实例。

*

*

*/

spl_autoload_register(function ($class) {

$prefix = 'Foo\\Bar\\';

$base_dir = __DIR__ . '/src/';

$len = strlen($prefix);

if (strncmp($prefix, $class, $len) !== 0) {

return;

}

//strncmp() 二进制安全比较字符串开头的若干个字符,第三个参数 $len 指定两字符串比较时使用的长度。

// 即最大比较长度。

$relative_class = substr($class, $len);

// substr() 返回字符串的子串

$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

// str_replace($search, $replace, $subject) 子字符串替换

if (file_exists($file)) {

require $file;

}

});

类示例(Class Example)

以下是一个可处理多命名空间的类实现示例:

/**

一个多用途的示例实现,包括了

允许多个基本目录用于单个

命名空间前缀的可选功能

下述示例给出了一个 foo-bar 类包,系统中路径结构如下……

/path/to/packages/foo-bar/

src/

Baz.php # Foo\Bar\Baz

Qux/

Quux.php # Foo\Bar\Qux\Quux

tests/

BazTest.php # Foo\Bar\BazTest

Qux/

QuuxTest.php # Foo\Bar\Qux\QuuxTest

……添加路径到 \Foo\Bar\ 命名空间前缀的类文件中

如下所示:

// 实例化加载器

$loader = new \Example\Psr4AutoloaderClass;

// 注册加载器

$loader->register();

// 为命名空间前缀注册基本路径

$loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');

$loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');

下述语句会让自动加载器尝试从

/path/to/packages/foo-bar/src/Qux/Quux.php

中加载 \Foo\Bar\Qux\Quux 类

new \Foo\Bar\Qux\Quux;

下述语句会让自动加载器尝试从

/path/to/packages/foo-bar/tests/Qux/QuuxTest.php

中加载 \Foo\Bar\Qux\QuuxTest 类:

new \Foo\Bar\Qux\QuuxTest;

*/

namespace Example;

class Psr4AutoloaderClass

{

/**

* 关联数组,键名为命名空间前缀,键值为一个基本目录数组。

*

* @var array

*/

protected $prefixes = array();

/**

* 通过 SPL 自动加载器栈注册加载器

*

* @return void

*/

public function register()

{

spl_autoload_register(array($this, 'loadClass'));

}

/**

* 为命名空间前缀添加一个基本目录

*

* @param string $prefix 命名空间前缀。

* @param string $base_dir 命名空间下类文件的基本目录

* @param bool $prepend 如果为真,预先将基本目录入栈

* 而不是后续追加;这将使得它会被首先搜索到。

* @return void

*/

public function addNamespace($prefix, $base_dir, $prepend = false)

{

// 规范化命名空间前缀

$prefix = trim($prefix, '\\') . '\\';

// 规范化尾部文件分隔符

$base_dir = rtrim($base_dir, DIRECTORY_SEPARATOR) . '/';

// 初始化命名空间前缀数组

if (isset($this->prefixes[$prefix]) === false) {

$this->prefixes[$prefix] = array();

}

// 保留命名空间前缀的基本目录

if ($prepend) {

array_unshift($this->prefixes[$prefix], $base_dir);

} else {

array_push($this->prefixes[$prefix], $base_dir);

}

}

/**

* 加载给定类名的类文件

*

* @param string $class 合法类名

* @return mixed 成功时为已映射文件名,失败则为 false

*/

public function loadClass($class)

{

// 当前命名空间前缀

$prefix = $class;

// 通过完整的命名空间类名反向映射文件名

while (false !== $pos = strrpos($prefix, '\\')) {

// 在前缀中保留命名空间分隔符

$prefix = substr($class, 0, $pos + 1);

// 其余的是相关类名

$relative_class = substr($class, $pos + 1);

// 尝试为前缀和相关类加载映射文件

$mapped_file = $this->loadMappedFile($prefix, $relative_class);

if ($mapped_file) {

return $mapped_file;

}

// 删除 strrpos() 下一次迭代的尾部命名空间分隔符

$prefix = rtrim($prefix, '\\');

}

// 找不到映射文件

return false;

}

/**

* 为命名空间前缀和相关类加载映射文件。

*

* @param string $prefix 命名空间前缀

* @param string $relative_class 相关类

* @return mixed Boolean 无映射文件则为false,否则加载映射文件

*/

protected function loadMappedFile($prefix, $relative_class)

{

// 命名空间前缀是否存在任何基本目录

if (isset($this->prefixes[$prefix]) === false) {

return false;

}

// 通过基本目录查找命名空间前缀

foreach ($this->prefixes[$prefix] as $base_dir) {

// 用基本目录替换命名空间前缀

// 用目录分隔符替换命名空间分隔符

// 给相关的类名增加 .php 后缀

$file = $base_dir

. str_replace('\\', '/', $relative_class)

. '.php';

// 如果映射文件存在,则引入

if ($this->requireFile($file)) {

// 搞定了

return $file;

}

}

// 找不到

return false;

}

/**

* 如果文件存在从系统中引入进来

*

* @param string $file 引入文件

* @return bool 文件存在则 true 否则 false

*/

protected function requireFile($file)

{

if (file_exists($file)) {

require $file;

return true;

}

return false;

}

}

这篇关于php psr 4 实例,PSR-4 自动加载 - 案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275278

相关文章

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.