首页 > 编程 > PHP > 正文

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

2020-03-22 18:23:07
字体:
来源:转载
供稿:网友
  • 参考资料:PHP手册-语言参考:http://php.net/manual/zh/language.namespaces.php概要:1. 声明了命名空间之后,下面的const, function, html' target='_blank'>class都会划归到该命名空间。2. 只有声明过命名空间的PHP 文件才能加载有命名空间的PHP文件。3. PHP 5.3 及以上才能使用命名空间名词: 关键字:namespace 用来声明 本PHP文件的命名空间 常量:__NAMESPACE__ 用来返回当前命名空间的名称 默认为空字符串
    操作符: use 默认以最后一个/后的字符串为别名,配合 as 则为 as后的字符串,与MySQL的字段别名一致。实际操作如下:在apache目录下建立如下文件:index.php,Order.php,User.phpOrder.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 Orderlist23 {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 /Order/call_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 Order/Orderlist;12 $orderlist = new orderlist;13 $orderlist->show_list();14 15 //外部访问静态变量和function 直接访问16 use Order;17 echo Order/STR;18 echo Order/detail();

    打印结果为:

    以上内容包含了:通过命名空间来访问文件和直接实例化访问,以及本空间直接访问。命名空间的存在是为了防止两个同名的class都被载入,使用命名空间在加载第三方的类时能避免同名冲突。下面来说一下自动加载SZ喎?http://www.it165.net/pro/pkqt/" target="_blank" class="keylink">QTCC1xMirs8bKx6O6U3RhbmRhcmQgUEhQIExpYnJhcnkgUEhQserXvL/io6zU2lBIUDXS1Lrz0tG+rcTa1sPU2lBIUNbQo6zO3tDowe3N4rCy17ChowpTUEyw/LqswcvSu8zX1eu21Mr9vt294bm5oaK1/LT6xvehotLss6Ohos7EvP60psDttci1xLqvyv2/4qGjCiZuYnNwOwo8c3Ryb25nPtfUtq/XsNTYv+LT0NLUz8K6r8r9PC9zdHJvbmc+CjxzdHJvbmc+c3BsX2F1dG9sb2FkX2NhbGw8L3N0cm9uZz6jurOiytS199PDy/nT0NLR16Ky4bXEX19hdXRvbG9hZCgpuq/K/cC017DU2Mfrx/PA4AoKPHA+VXNlci5waHAgxNrI3c6qo7o8L3A+Cgo8cHJlIGNsYXNzPQ=="brush:java;">1 namespace User;2 //直接载入Order3 #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 /Order/Orderlist();16 $orderList->show_list();

    打印结果为:

    注意:当采用SPL载入文件时,use并不能触发spl_autoload_register函数,他会被new触发,这样就会提示找不到文件,所有采用spl_autoload_call 来提前触发自动载入。本文地址:http://www.cnblogs.com/martin-tan/p/4864539.html问题:使用get_include_path,spl_autoload_extensions并且spl_autoload_register默认为空的情况下并不能直接载入目录下的文件,原因如上。(?)PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表