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

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體:   |    |    |  超大  

参考资料:

php手册-语言参考:http://php.net/manual/zh/language.namespaces.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<?php2/**3* @Author: Martin4* @Support: Martin5* @Last Modified by: Martin6*/7namespace Order;89constSTR = 'order list<br />';1011functiondetail()12{13return'order detail<br />';14}15functioncall_by_self()16{17return'call by self<br />';18}19/**20*21*/22classOrderlist23{2425publicfunction__construct()26{27echo'Class NameSpace is "', __NAMESPACE__, '"';28}29publicfunctionshow_list()30{31for($i= 0;$i< 5;$i++) {32echo"<ul><li>this is order$i<br />";33//内部直接访问34echodetail();35echo"</li></ul>";36}37}38}39//内部通过命名空间访问40echo\Order\call_by_self();

index.php 内容为:

1<?php2/**3* @Author: Martin4* @Support: Martin5* @Last Modified by: Martin6*/7namespace index;8include_once('Order.php');910//外部访问class 实例化即可使用11useOrder\Orderlist;12$orderlist=neworderlist;13$orderlist->show_list();1415//外部访问静态变量和function 直接访问16useOrder;17echoOrder\STR;18echoOrder\detail();

打印结果为:

以上内容包含了:通过命名空间来访问文件和直接实例化访问,以及本空间直接访问。

命名空间的存在是为了防止两个同名的class都被载入,使用命名空间在加载第三方的类时能避免同名冲突。

下面来说一下自动加载

SPL 的全称是:Standard PHP Library PHP标准库,在PHP5以后已经内置在PHP中,无需另外安装。

SPL包含了一套针对数据结构、迭代器、异常、文件处理等的函数库。

自动装载库有以下函数

spl_autoload_call:尝试调用所有已注册的__autoload()函数来装载请求类

User.php 内容为:

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

打印结果为:

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

spl_autoload_extensions: 注册并返回spl_autoload函数使用的默认文件扩展名。

get_include_path: 设置默认引用的文件夹

spl_autoload_register: 自动引入文件

实际操作如下:

我们重新调整目录结构和并复制order 到 lib下面 如下:

修改User.php 如下:

1namespace User;23//直接载入Order4#include('Order.php');5//自动载入6define('LIB_DIR', __DIR__ . DIRECTORY_SEPARATOR . 'lib' .DIRECTORY_SEPARATOR);7spl_autoload_register(function($class) {8$path= LIB_DIR .$class. '.lib.php';9include($path);10});1112spl_autoload_call('Order');13useOrder;1415$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默认为空的情况下并不能直接载入目录下的文件,原因如上。(?)

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航