PHP命名空间

命名空间是一种封装事物的方法。命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。

定义命名空间
——如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
——在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。
——所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前

<html>
<?php
namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句
?>

——同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。

定义子命名空间
与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。如




<?php
namespace MyProject\Sub\Level;


在同一个文件中定义多个命名空间

首先要强调,非常不提倡在同一个文件中定义多个命名空间。
在同一个文件中定义多个命名空间有两种语法形式
简单语法

<?php
namespace MyProject;
class Connection { /* ... */ }
function connect() { /* ... */ }


namespace OtherMyProject;
class Connection { /* ... */ }
function connect() { /* ... */ }

大括号语法【建议使用这种】

<?php
namespace MyProject{
class Connection { /* ... */ }
function connect() { /* ... */ }


namespace OtherMyProject{
class Connection { /* ... */ }
function connect() { /* ... */ }



将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来,

<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace { // global code
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}



除了开始的declare语句外,命名空间的括号外不得有任何PHP代码。

<?php
declare(encoding='UTF-8');
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}

namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}