定义命名空间
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare
关键字。
示例1:申明单个命名空间
类文件与调用文件都在__Mytest__目录下
申明类:
<?php
namespace Mytest;
class TestClass {
public function getFunctionName()
{
echo __FUNCTION__;
}
}
使用:
<?php
require_once 'Test.php';
$testClass = new Mytest\TestClass;
$testClass->getFunctionName();
结果:
getFunctionName
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前:
示例2:我们修改定义类的地方,客户端调用代码不变,代码如下:
<?php
define('NAME','vstary');
namespace Mytest;
class TestClass {
public function getFunctionName()
{
echo __FUNCTION__;
}
}
结果:
Fatal error: Namespace declaration statement has to be the very first statement in the script
__另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。__即我们在Test.php文件中申明了命名空间,同时我也可以在Test2.php,Test3,php中申明同样的命名空间。
定义子命名空间
与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
示例3:
<?php
namespace Mytest\MytestSub; //子命名空间的定义
class TestClass {
public function getClassName()
{
echo __CLASS__;
}
}
在同一个文件中定义多个命名空间
也可以在同一个文件中定义多个命名空间。在同一个文件中定义多个命名空间有两种语法形式。
示例4:定义多个命名空间,简单组合语法
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法。
示例5:定义多个命名空间,大括号语法
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。
将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来,例如:
示例6:定义多个命名空间和不包含在命名空间中的代码
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
除了开始的declare语句外,命名空间的括号外不得有任何PHP代码。
示例7:定义多个命名空间和不包含在命名空间中的代码
<?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();
}