PHP Chaos我爱编程

PHP 现代开发基础知识: 命名空间 - namespace

2016-10-08  本文已影响125人  xiaojianxu

目录

  1. 为什么使用命名空间
  2. 使用命名空间

为什么使用命名空间

目的,就是为了避免出现命名冲突,导致 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 默认将使用导入的类名作为别名

总结:

  1. use 关键词必须要写在 PHP 文件的头部,在标签 <?php 或 namespace 声明之后;
  2. 使用 use 来倒入代码时,不需要以 \ 字符作为开始,PHP 默认命名空间是 fully qualified;
  3. 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();
}
}

上一篇下一篇

猜你喜欢

热点阅读