在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
命名空间主要为了解决用户编写的代码与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
|
2022-08-30
2022-08-17
2022-11-06
2022-08-18
2022-07-18
请发表评论