#### ******一.## 定义命名空间
:命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间
:命名空间针对 函数、类名、const常量 三部分起作用,并统称为“元素”
:在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
:多级空间的最后一级空间就称为“子级空间”
:全局空间:如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀'\'表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此
二.访问空间元素的三种形式
1.非限定名称:
2.限定名称
3.完全限定名称
file1.php 文件代码
```
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
```
file2.php 文件代码
~~~
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* 非限定名称 */ 本空间下
foo(); // 解析为函数 Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo ,方法为 staticmethod
echo FOO; // 解析为常量 Foo\Bar\FOO
/* 限定名称 */ 相对于Foo\Bar\空间
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
// 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO
/* 完全限定名称 */ 相对于全局
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>
类似于文件引入
~~~
2.5名称解析遵循下列规则
1. 对完全限定名称的函数,类和常量的调用在编译时解析。例如*new \\A\\B*解析为类*A\\B*。
(重点)2. 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间*A\\B\\C*被导入为*C*,那么对*C\\D\\e()*的调用就会被转换为*A\\B\\C\\D\\e()*。
(重点)3. 在命名空间内部,**所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称**。例如,在命名空间*A\\B*内部调用*C\\D\\e()*,则*C\\D\\e()*会被转换为*A\\B\\C\\D\\e()*。
4. 对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量
2.6## 命名空间的顺序
先全局,后use导入,最后才是当前命名空间;
use导入会自动把导入空间转换成全局空间
三.## 命名空间:别名/导入
:php命名空间支持两种使用别名或导入方式:为类名称使用别名,或者为命名空间名称使用别名
```
namespace cn\\my; //声明命名空间 cn\\my
class User{ } // 当前空间下声明一个类
namespace shop; // 在创建一个空间
use cn\\my; //导入一个命名空间
$my\_User = new my\\User(); //导入命名空间后可使用限定名称调用元素
use cn\\my as u; //命名空间使用别名
$my\_User = new u\\User(); //使用别名代替空间名
use cn\\my\\User; //导入一个类
$my\_User = new User(); //导入类后可使用非限定名称调用元素
use cn\\my\\User as myUser; // 为类使用别名
$my\_User = new myUser(); //使用别名代替空间名
?>
```
三.5
常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串
~~~
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
~~~
~~~
echo '"', __NAMESPACE__, '"'; // 输出 ""
~~~