zoukankan      html  css  js  c++  java
  • php使用命名空间时自动加载机制

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

    1.编写a.php文件

     1 namespace namespace_testmodule;
     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 
    amespace_testmodulea();
    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 amespace_testmodulea(),发现未定义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/

  • 相关阅读:
    第一次个人编程作业
    第一次博客作业
    动态规划 01背包学习中
    学习dijk最短路径中
    蓝桥杯 小盆友排队
    蓝桥杯 地宫取宝
    简单的BFS学习笔记
    C趣味100道之58.拉丁方的一些想法。
    蓝桥杯 错误票据--!偶然间发现,然后呵呵!
    函数实现计算标准差
  • 原文地址:https://www.cnblogs.com/whyly/p/10263457.html
Copyright © 2011-2022 走看看