目录
- 为什么使用命名空间
- 使用命名空间
为什么使用命名空间
目的,就是为了避免出现命名冲突,导致 PHP 运行失败。
同一个开发团队中,这个命名冲突,可以通过项目管理规范来避免。可是,随着 PHP 项目的不断演变,一个项目代码也会不断增多,PHP 社区也积累了很多的优秀代码包。现代 PHP 项目中,我们就可以直接使用这些现成的代码包,减少开发工作量,缩短开发周期,更少的 bug,更快的系统性能。
正是,因为引入了第三方代码包,而这些代码包中:类(class), 接口(interface),函数 (function) 和 常量 (constant) 都是无法控制的。那么,命名空间的就显得不可或缺。
具体命名空间例子:
namespace Jamesxu\Component;
命名空间的声明,总是出现单独一行出现在 <?php 标签之后。上面代码的意思是,类是定义/生存在 Component 子命名空间下。
一个命名空间包含与组织了相关的 PHP 类,如同一个文件系统包含相关的文件。
声明
每个 PHP 类,接口,函数/方法,与参数都是存在于一个命名空间(或子命名空间)。
命名空间,以单独一行出现在 PHP 开标签 <?php 之后。
格式是:namespace 空格字符 命名空间名字; (; 代表结束)
namespace 通常用来声明一个 top-level vendor name,如:
<?php
namespace Jamexu;
所有 PHP class,interface, functions, or constant 声明都在该命名空间下。可以使用子命名空间来组织代码。
子命名空间的声明也和前面相同,唯一不同的是命名空间与子命名空间使用 \ 字符分隔。
在命名空间下,声明名为 ModernPHP子命名空间:
<?php
namespace Jamesxu\ModernPHP;
引用和别名
使用别名,可以不需要输入整个命名空间。
Example 2-1. Namespace without alias
没有别名的命名空间
<?php
$response = new \Symfony\Component\HttpFoundation\Response('Oops', 400);
$response->send();
Example 2-2. Namespace with default alias
具有默认别名的命名空间
<?php
use Symfony\Component\HttpFoundation\Response;
$response = new Response('Oops', 400);
$response->send();
tell PHP we intend to use the Symfony\Component\HttpFoundation\Response class with the use keyword.
Example 2-3. Namespace with custom alias
自定义别名( as Res)
<?php
use Symfony\Component\HttpFoundation\Response as Res;
$r = new Res('Oops', 400);
$r->send();
use Symfony\Component\HttpFoundation\Response as Res; 导入 Response 类,并使用 Res 作为 Response 类的别名。如果不追加 as Res,PHP 默认将使用导入的类名作为别名
总结:
- use 关键词必须要写在 PHP 文件的头部,在标签 <?php 或 namespace 声明之后;
- 使用 use 来倒入代码时,不需要以 \ 字符作为开始,PHP 默认命名空间是 fully qualified;
- use 必须要存在于全局作用域中,而不是在一个类或方法中,因为需要在编译时使用到。可以在命名空间的声明下,使用 use 导入代码。
引入函数与常量
use func
<?php
use funs Namesoace\functionName;
functionName();
use constant
<?php
use constant Namesoace\CONST_NAME;
echo CONST_NAME;
多行导入
<?php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Cookie;
全局命名空间 (Global Namespace)
使用一个没有命令空间的类,接口,方法,或常数时,PHP 默认把类,接口,方法,或常数当作存在于当前命名空间来处理。
在另一个命名空间中,引用一个命名空间的类,接口,方法,或常量,必须要使用 fully qualified PHP class name (namespace + class name)。既可以输入 fully qualified PHP class name,或用 use 导入。
在另一个命名空间中,使用全局变量代码,只需要在 class,interface,function,or constant 前添加 \ 字符。
Example 2-4. Unqualified class name inside another namespace
<?php
namespace My\App;
class Foo
{
public function doSomething()
{
/*
Fails, because PHP searches for a \My\App\Exception >class that does not exist.
*/
$exception = new Exception();
}
}
添加 \ 做前缀,PHP 将 Exception 类作为全局命名空间来处理
<?php
namespace My\App;
class Foo
{
public function doSomething()
{
// add a \ prefix the Exception class name
// It tells PHP to look for the Exception class in the global >namespace instead of the current
// namespace.
throw new \Exception();
}
}