分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

php使用命名空间时自动加载机制

发布时间:2023-09-06 02:29责任编辑:董明明关键词:暂无标签

命名空间主要为了解决用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。不过并不是你定义了使用命名空间的类,就可以在任何地方随意使用了,需要在程序运行时将定义命名空间的类文件加载(include or require)进来。但是如果将所有的命名空间都提前加载进来,显示是不合理的。为此,php有专门的自动加载机制spl_autoload_register。下面我们通过代码来具体看一下:

1.编写a.php文件

 1 namespace namespace_test\module; 2 ?3 class a 4 { 5 ????function __construct() 6 ????{ 7 ????????echo ‘------实例化a------<br>‘; 8 ????} 9 ????10 ????function out()11 ????{12 ????????echo ‘hello!‘;13 ????}14 }

2.编写b.php文件

 1 define(‘ROOT_PATH‘, dirname(dirname(__FILE__))); 2 ?3 function auto_load($class) 4 { 5 ????echo ‘auto_load-->class: ‘.$class.‘<br>‘; 6 ????$arr = explode(‘\\‘, $class); 7 ?????8 ????if (count($arr) > 0) 9 ????{10 ????????$file = ROOT_PATH."/{$arr[1]}_{$arr[2]}/{$arr[2]}.php";11 ????12 ????????@include_once $file;13 ????}14 }15 16 spl_autoload_register("auto_load");17 18 echo ‘------实例化a之前------<br>‘;19 $obj = new \namespace_test\module\a();20 echo ‘------实例化a之后------<br>‘;21 22 $obj->out();

文件目录结构如下图:

通过浏览器访问b.php文件,程序运行结果如下:

程序说明:

spl_autoload_register("auto_load")作用是在发现未定义的类时运行auto_load()方法,auto_load的参数$class即为类的完整名称,如上图auto_load-->class所示。程序整个过程如下:

1.当运行到$obj = new \namespace_test\module\a(),发现未定义a;

2.调用auto_load($class)方法,a的完整类名作为参数$class传递给auto_load;

3.通过开发人员的自定义规则解析文件路径,加载a.php文件;

4.实例化a,运行后续程序。

最后,说明一下关于命名空间完整类名的定义应尽量遵循PSR-4标准。

参考:

http://www.cnblogs.com/woider/p/6443854.html
https://laravel-china.org/topics/2081/psr-specification-psr-4-automatic-loading-specification
https://www.php-fig.org/psr/psr-4/

php使用命名空间时自动加载机制

原文地址:https://www.cnblogs.com/whyly/p/10263457.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved