zoukankan      html  css  js  c++  java
  • 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/
  • 相关阅读:
    字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
    Context Application 使用总结 MD
    RxJava RxPermissions 动态权限 简介 原理 案例 MD
    Luban 鲁班 图片压缩 MD
    FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
    组件化 得到 DDComponent JIMU 模块 插件 MD
    gradlew 命令行 build 调试 构建错误 Manifest merger failed MD
    protobuf Protocol Buffers 简介 案例 MD
    ORM数据库框架 SQLite 常用数据库框架比较 MD
    [工具配置]requirejs 多页面,多入口js文件打包总结
  • 原文地址:https://www.cnblogs.com/martin-tan/p/4864539.html
Copyright © 2011-2022 走看看