1. 声明了命名空间之后,下面的const, function, class都会划归到该命名空间。
2. 只有声明过命名空间的PHP 文件才能加载有命名空间的PHP文件。
3. PHP 5.3 及以上才能利用命名空间
名词:
关键字:namespace 用来声明 本PHP文件的命名空间
常量:__NAMESPACE__ 用来返回当前命名空间的名称 默认为空字符串
操作符: use 默认以末了一个\后的字符串为别名,合营 as 则为 as后的字符串,与MySQL的字段别名同等。
为什么利用命名空间
我们的代码可能和其他开拓者的代码利用相同的类名、接口名、函数或常量名,如果不该用命名空间,名称会起冲突,导致PHP实行出错。而利用命名空间将代码放到唯一的厂约定名空间,我们的代码就可以和其他开拓者利用相同的类名、接口名、函数或常量名。
当然如果你开拓的是小型个人项目,只有少量的依赖,类名冲突可能不是问题,但是如果在团队中事情,开拓用到许多第三方依赖的大型项目,就要负责对待命名冲突问题,由于你无法掌握项目依赖在全局命名空间中引入的类、接口、函数和常量,这也是为什么要利用命名空间的缘故原由。
实际操作如下:
在apache目录下建立如下文件:index.php,Order.php,User.php
Order.php 的内容为
<?php/ @Author: Martin @Support: Martin @Last Modified by: Martin /namespace Order;const STR = 'order list<br />';function detail(){ return 'order detail<br />';}function call_by_self(){ return 'call by self<br />';}/ /class Orderlist{ public function __construct() { echo 'Class NameSpace is \"大众', __NAMESPACE__, '\"大众'; } public function show_list() { for ($i = 0; $i < 5; $i++) { echo \"大众<ul><li>this is order$i<br />\"大众; //内部直接访问 echo detail(); echo \"大众</li></ul>\"大众; } }}//内部通过命名空间访问echo \Order\call_by_self();index.php 内容为:<?php/ @Author: Martin @Support: Martin @Last Modified by: Martin /namespace index;include_once('Order.php');//外部访问class 实例化即可利用use Order\Orderlist;$orderlist = new orderlist;$orderlist->show_list();//外部访问静态变量和function 直接访问use Order;echo Order\STR;echo Order\detail();
打印结果为:
以上内容包含了:通过命名空间来访问文件和直接实例化访问,以及本空间直接访问。
命名空间的存在是为了防止两个同名的class都被载入,利用命名空间在加载第三方的类时能避免同名冲突。
下面来说一下自动加载
SPL 的全称是:Standard PHP Library PHP标准库,在PHP5往后已经内置在PHP中,无需其余安装。
SPL包含了一套针对数据构造、迭代器、非常、文件处理等的函数库。
自动装载库有以下函数
spl_autoload_call:考试测验调用所有已注册的__autoload()函数来装载要求类
User.php 内容为:
namespace User;//直接载入Order#include('Order.php');//自动载入spl_autoload_register(function($className) { var_dump($className);});spl_autoload_call('Order');
打印结果为:
SPL自动载入函数包含如下:
spl_autoload_extensions: 注册并返回spl_autoload函数利用的默认文件扩展名。
get_include_path: 设置默认引用的文件夹
spl_autoload_register: 自动引入文件
实际操作如下:
我们重新调度目录构造和并复制order 到 lib下面 如下:
修正User.php 如下:
namespace User;//直接载入Order#include('Order.php');//自动载入define('LIB_DIR', __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR);spl_autoload_register(function ($class) { $path = LIB_DIR . $class . '.lib.php'; include ($path);});spl_autoload_call('Order');use Order;$orderList = new \Order\Orderlist();$orderList->show_list();
打印结果为:
把稳:
当采取SPL载入文件时,use并不能触发spl_autoload_register函数,他会被new触发,这样就会提示找不到文件,
所有采取spl_autoload_call 来提前触发自动载入。