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开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、