定义命名空间


虽然任意合法的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();
}

后续教程PHP命名空间(三)-使用命名空间