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 \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都被载入,使用命名空间在加载第三方的类时能避免同名冲突。
 
下面来说一下自动加载
 
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 \Order\Orderlist();
16 $orderList->show_list();

 

打印结果为:

 

注意:
当采用SPL载入文件时,use并不能触发spl_autoload_register函数,他会被new触发,这样就会提示找不到文件,
所有采用spl_autoload_call 来提前触发自动载入。
 
 
 
 

 

 
posted @ 2015-10-09 18:22  martin.tan  阅读(4092)  评论(1编辑  收藏  举报