• PHP命名空间和自动加载初探


    参考资料:
     
    概要:
    1. 声明了命名空间之后,下面的const, function, class都会划归到该命名空间。
    2. 只有声明过命名空间的PHP 文件才能加载有命名空间的PHP文件。
    3. PHP 5.3 及以上才能使用命名空间
     
     
    名词:
        关键字:namespace 用来声明 本PHP文件的命名空间
        常量:__NAMESPACE__ 用来返回当前命名空间的名称 默认为空字符串
        操作符: use 默认以最后一个后的字符串为别名,配合 as 则为 as后的字符串,与MySQL的字段别名一致。
     
    实际操作如下:
    在apache目录下建立如下文件:index.php,Order.php,User.php
     
     
    Order.php 的内容为
     
     
     1 <?php
     2 /**
     3  * @Author: Martin
     4  * @Support: Martin
     5  * @Last Modified by:   Martin
     6  */
     7 namespace Order;
     8 
     9 const STR = 'order list<br />';
    10 
    11 function detail()
    12 {
    13     return 'order detail<br />';
    14 }
    15 function call_by_self()
    16 {
    17     return 'call by self<br />';
    18 }
    19 /**
    20  *
    21  */
    22 class Orderlist
    23 {
    24 
    25     public function __construct()
    26     {
    27         echo 'Class NameSpace is "', __NAMESPACE__, '"';
    28     }
    29     public function show_list()
    30     {
    31         for ($i = 0; $i < 5; $i++) {
    32             echo "<ul><li>this is order$i<br />";
    33             //内部直接访问
    34             echo detail();
    35             echo "</li></ul>";
    36         }
    37     }
    38 }
    39 //内部通过命名空间访问
    40 echo Ordercall_by_self();

    index.php 内容为:

     1 <?php
     2 /**
     3  * @Author: Martin
     4  * @Support: Martin
     5  * @Last Modified by:   Martin
     6  */
     7 namespace index;
     8 include_once('Order.php');
     9 
    10 //外部访问class 实例化即可使用
    11 use OrderOrderlist;
    12 $orderlist = new orderlist;
    13 $orderlist->show_list();
    14 
    15 //外部访问静态变量和function 直接访问
    16 use Order;
    17 echo OrderSTR;
    18 echo Orderdetail();

    打印结果为:

    以上内容包含了:通过命名空间来访问文件和直接实例化访问,以及本空间直接访问。
    命名空间的存在是为了防止两个同名的class都被载入,使用命名空间在加载第三方的类时能避免同名冲突。
     
    下面来说一下自动加载
     
    SPL 的全称是:Standard PHP Library PHP标准库,在PHP5以后已经内置在PHP中,无需另外安装。
    SPL包含了一套针对数据结构、迭代器、异常、文件处理等的函数库。
     
    自动装载库有以下函数
    spl_autoload_call:尝试调用所有已注册的__autoload()函数来装载请求类

    User.php 内容为:

    1 namespace User;
    2 //直接载入Order
    3 #include('Order.php');
    4 //自动载入
    5 spl_autoload_register(function($className) {
    6     var_dump($className);
    7 });
    8 spl_autoload_call('Order');

    打印结果为:

     

    SPL自动载入函数包含如下:

    spl_autoload_extensions: 注册并返回spl_autoload函数使用的默认文件扩展名。
    get_include_path: 设置默认引用的文件夹
    spl_autoload_register: 自动引入文件
     
    实际操作如下:
    我们重新调整目录结构和并复制order 到 lib下面 如下:

    修改User.php 如下:

     1 namespace User;
     2 
     3 //直接载入Order
     4 #include('Order.php');
     5 //自动载入
     6 define('LIB_DIR', __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR);
     7 spl_autoload_register(function ($class) {
     8     $path = LIB_DIR . $class . '.lib.php';
     9     include ($path);
    10 });
    11 
    12 spl_autoload_call('Order');
    13 use Order;
    14 
    15 $orderList = new OrderOrderlist();
    16 $orderList->show_list();

    打印结果为:

    注意:
    当采用SPL载入文件时,use并不能触发spl_autoload_register函数,他会被new触发,这样就会提示找不到文件,
    所有采用spl_autoload_call 来提前触发自动载入。
     
     
     
     
     
    转载请注明出处:http://www.cnblogs.com/martin-tan/
  • 相关阅读:
    centos7下安装docker
    java中获取两个时间中的每一天
    Linq中string转int的方法
    logstash 主题综合篇
    Windows环境下ELK(5.X)平台的搭建
    本地没问题 服务器 提示 Server Error in '/' Application
    错误 未能找到类型或命名空间名称"xxxxxx"的真正原因
    System.web和System.WebServer
    Chrome Adobe Flash Player 因过期而 阻止
    请求WebApi的几种方式
  • 原文地址:https://www.cnblogs.com/martin-tan/p/4864539.html
Copyright © 2020-2023  润新知