namespace 命名空间详解
PHP中的namespace命名空间详解
1、什么是命名空间。
在php程序语言里边,语法规则要求同名称的 函数
、类名
、const 常量
在一个请求里边不允许出现多次
。如果有的应用程序不得已必须出现多个同名的 函数
、类名
、常量
,那么我们就可以把它们放到不同的空间里边做请求。这个不同的空间就称作命名空间
。空间可以看做一个容器,存储类
、函数
、const
常量的容器
。
1. 同名元素在同一空间的简单情况:
<?php
function getInfo(){
echo "hello!";
}
function getInfo(){
echo "hello!";
}
getInfo();
同名称的两个函数
在不同一个空间
进行访问系统要报错
。上面代码中错误:
2. 同名元素在不同空间的简单情况:
<?php
namespace Testl;
function getInfo(){
echo "Testl";
}
getInfo();
echo "<br>";
namespace Test2;
function getInfo(){
echo "Test2";
}
getInfo();
同名称的两个函数
放到不同空间
做访问,就不会报错
。
同一个请求里边定义两个同名的函数 getInfo(),2.中由于有使用命名空间,使得程序可以正常执行。
2、使用命名空间。
通过 namespace 关键字声明命名空间。namespace 空间名称;
(空间名称 按照php正确的命名方式定义即可);
命名空间针对 函数、类名、const常量 三部分起作用,并统称为元素。
1. 常量的声明:
define (名称,值); // (在类外部声明常量)与命名空间没有关系
// 同名称常量只能 define 一次
const 名称=值; // 与命名空间有关系
① const 可以在类的内部声明常量信息(类常量)。
② const 也可以在类外部声明常量(正常常量)。
使用命名空间的时候 const 可以放到类外部声明常量。
同名称的多个常量,可以分别定义到不同的命名空间
里边。
2. 命名空间里边 const 和 define 的区别:
前者针对命名空间发生影响,后者不发生影响。
const 可以声明多个同名称的常量。
define 对同名称常量只能声明一个。
3. 简单的元素访问。
4. 子级(多级)空间。
命名空间可以让我们存放许多元素(函数、类、常量),有的时候元素比较多,为了管理方便,可以对元素进行分门别类
地存储。也就是说命名空间可以设置为多级空间。多级空间
的最后一级空间
就称为子级空间
。
空间元素访问的三种形式:①非限定名称方式、①完全限定名称方式、③限定名称。
① 非限定名称
echo Shop::$impression; 就近访问上边与其挨着最近空间的 Shop 元素
(类似 php 引入文件:include 「common.php」;// 相对路径引入当前目录下的 common.php 文件)。
② 限定名称
echo tianfu\Shop::$impression;把 当前空间
和 tianfu 空间联合
获得 Shop 元素。
(类似php引入文件:include 「Common/Conf/config.php」; 相对路径)。
③ 完全限定名称
echo \wuhan\Shop:::$impression; 访问 wuhan 空间的 Shop 元素
(类似 php 引入文件:include 「d:/web/1121/Conf/common.php」; 绝对路径引入文件)。
5. 引入机制。
命名空间可以声明为多级空间,这个多级空间元素在其他空间内部访问的时候,不得已需要通过 完全限定名称
方式,这个完全限定名称不方便开发、维护
,为了降低代码的复杂度,可以在当前的空间把指定的空间给引入
进来,进而可以方便地通过限定名称
的方便的形式使用其他空间的元素。
(1).空间引入:
use 空间;
(2).类元素引入:
use 空间\空间\空间\类元素;
空间引入 可以解决完全限定名称
访问元素的繁琐性,但是还需要通过限定名称
方式访问,仍然不够简便,如果引入空间的元素是类
,就可以直接把这个类引入到当前空间,使用的时候也就可以通过非限定名称
方式访问,非常便捷。
注:(只能做类元素
引入,函数
和常量
不可以)。
①.类元素引入普通情况:
②.类元素引入时候的特殊情况(引入的类
和当前空间的类重名
的情况):
解决方法: 别名使用
use 空间\元素 as 别名;
把其他空间的一个类元素
引入到当前空间,如果当前空间也有一个同名
的类元素,则引入元素 与 当前空间元素就会有冲突,为了避免冲突产生,可以给引入空间元素起一个别名。
引入的 Shop 与当前空间 Shop 有冲突取别名:
6. 公共空间。
一个php文件里边没有 namespace 关键字声明,则该文件的元素都存在于公共空间
:
访问公共空间的元素统一设置为: \元素
。
下面举2个例子:
例子1:两个文件:CommonSpace.php、CommonSpace1.php (CommonSpace.php include引入CommonSpace1.php)。
CommonSpace.php
<?php
namespace Wuhan;
function f1(){
echo "好心情";
}
/* 处于公共空间的文件被引入,针对当前空间不发生影响。 */
include("CommonSpace1.php"); /* 公共空间 */
/* 访问元素 */
f1(); /* 好心情 当前空间就是Wuhan空间 */
echo '<br>';
echo \NAME; /* 访问公共空间的元素 */
/*本身有命名空间,引入的文件是公共空间,本身的空间访问不到,会到 别的空间去找这个元素*/
CommonSpace1.php
<?php
const NAME = "ThinkCsly";
function f1(){
echo 'ok';
}
function f2(){
echo 'good';
}
(1). CommonSpace.php 有 namespace,CommonSpace1.php 没有 (CommonSpace1.php 处于公共空间)。被引入的文件空间
此时被引入的文件 CommonSpace1.php 属于公共空间 针对当前空间不发生影响。
通过非限定名称
访问访问一个元素(函数、常量)。
① 首先获得本空间元素
② 其次获得公共空间元素
在 CommonSpace.php 中如果注释掉 f1() 函数,则输出:,此时 f1() 调用的公共空间的 f1() 函数; f1() 取消注释 输出:
,此时 f1() 调用的 Wuhan 命名空间的函数 f1();
例子2:
两个文件:ReverseCommonSpace、ReverseCommonSpace1.php (ReverseCommonSpace.php include引入ReverseCommonSpace1.php)。ReverseCommonSpace.php
<?php
function f1(){
echo "好心情";
}
const NAME = 'eiomi';
function f2(){
echo "good";
}
include("ReverseCommonSpace1.php"); /* 有命名空间 */
\f2();//访问公共空间要有"\"斜杠,提高代码可读性
//f2(); 也可以,公共空间最好加上反斜杠, good 当前空间(公共空间)
echo '<br>';
echo NAME;
echo '<br>';
echo \Wuhan\NAME;
echo '<br>';
/*f3(); *//* 不能访问,会报错,正确访问形式: \Wuhan\f3(); */
\Wuhan\f3();
/*本身是公共空间,引入的文件是有命名空间的,本身的空间访问不到,不会到 别的空间去找这个元素*/
如果f3();不注释 会报错:
注释后输出正确信息:ReverseCommonSpace1.php
<?php
namespace Wuhan;
const NAME = "ThinkCsly";
function f2(){
echo 'good';
}
function f3(){
echo 'buy book';
}
7. 命名空间使用注意。
(1).错误做法例子:
正确做法与错误原因:
(2).命名空间注意点总结:
1).声明命名空间的当前脚本的第一个namespace关键字前面不能有任何代码(header头代码也要写在下边)。
2).命名空间是虚拟抽象的空间,不是真实存在的目录。
3).同一请求的多个文件可以使用同名称的命名空间,只要这些文件里边不出现多个同名称、同类型的元素就可以。
4).php脚本文件第一个namespace关键字前边除了注释,不能有其他代码。
8. 练手。
本作品采用《CC 协议》,转载必须注明作者和本文链接