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

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数