namespace 命名空间详解

PHP中的namespace命名空间详解

1、什么是命名空间。

在php程序语言里边,语法规则要求同名称的 函数类名const 常量一个请求里边不允许出现多次。如果有的应用程序不得已必须出现多个同名的 函数类名常量,那么我们就可以把它们放到不同的空间里边做请求。这个不同的空间就称作命名空间 。空间可以看做一个容器,存储类函数const 常量的容器
1. 同名元素在同一空间的简单情况:

<?php
function getInfo(){
   echo "hello!";
}

function getInfo(){
   echo "hello!";
}
getInfo();

同名称的两个函数不同一个空间进行访问系统要报错。上面代码中错误:
file
2. 同名元素在不同空间的简单情况:

<?php

namespace Testl;

function getInfo(){
  echo "Testl";
}
getInfo();
echo "<br>";

namespace Test2;

function getInfo(){
  echo "Test2";
}
getInfo();

同名称的两个函数放到不同空间做访问,就不会报错
file
同一个请求里边定义两个同名的函数 getInfo(),2.中由于有使用命名空间,使得程序可以正常执行。

2、使用命名空间。

通过 namespace 关键字声明命名空间。
namespace 空间名称;(空间名称 按照php正确的命名方式定义即可);
命名空间针对 函数、类名、const常量 三部分起作用,并统称为元素。
1. 常量的声明:
define (名称,值); // (在类外部声明常量)与命名空间没有关系
                               // 同名称常量只能 define 一次
file
const 名称=值;     // 与命名空间有关系
                              ① const 可以在类的内部声明常量信息(类常量)。
                              ② const 也可以在类外部声明常量(正常常量)。
                              使用命名空间的时候 const 可以放到类外部声明常量。
                              同名称的多个常量,可以分别定义到不同的命名空间里边。
file
2. 命名空间里边 const 和 define 的区别:
  前者针对命名空间发生影响,后者不发生影响。
  const 可以声明多个同名称的常量。
  define 对同名称常量只能声明一个。

3. 简单的元素访问。
file
4. 子级(多级)空间。
命名空间可以让我们存放许多元素(函数、类、常量),有的时候元素比较多,为了管理方便,可以对元素进行分门别类地存储。也就是说命名空间可以设置为多级空间。多级空间最后一级空间就称为子级空间
空间元素访问的三种形式:①非限定名称方式、①完全限定名称方式、③限定名称。
file
file
① 非限定名称
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 空间;
file
(2).类元素引入:
use 空间\空间\空间\类元素;

空间引入 可以解决完全限定名称访问元素的繁琐性,但是还需要通过限定名称方式访问,仍然不够简便,如果引入空间的元素是,就可以直接把这个类引入到当前空间,使用的时候也就可以通过非限定名称方式访问,非常便捷。
注:(只能做类元素引入,函数常量不可以)。

①.类元素引入普通情况:
file
②.类元素引入时候的特殊情况(引入的类当前空间的类重名的情况):
file
解决方法: 别名使用
use 空间\元素 as 别名;
把其他空间的一个类元素引入到当前空间,如果当前空间也有一个同名的类元素,则引入元素 与 当前空间元素就会有冲突,为了避免冲突产生,可以给引入空间元素起一个别名。
引入的 Shop 与当前空间 Shop 有冲突取别名:
file
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() 函数,则输出:file,此时 f1() 调用的公共空间的 f1() 函数; f1() 取消注释 输出:file,此时 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();不注释 会报错:file
注释后输出正确信息:file
ReverseCommonSpace1.php

<?php

namespace Wuhan;

const NAME = "ThinkCsly";

function f2(){
    echo 'good';
}

function f3(){
    echo 'buy book';
}

7. 命名空间使用注意。
(1).错误做法例子:
file
正确做法与错误原因:
file
(2).命名空间注意点总结:
1).声明命名空间的当前脚本的第一个namespace关键字前面不能有任何代码(header头代码也要写在下边)。
2).命名空间是虚拟抽象的空间,不是真实存在的目录。
3).同一请求的多个文件可以使用同名称的命名空间,只要这些文件里边不出现多个同名称、同类型的元素就可以。
4).php脚本文件第一个namespace关键字前边除了注释,不能有其他代码。

8. 练手。
file

本作品采用《CC 协议》,转载必须注明作者和本文链接
ThinkQ
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!