您的位置:首页 > 编程语言 > PHP开发

PHP中的命名空间

2015-09-01 13:50 706 查看

概述

命名空间的作用是解决命名冲突

定义命名空间

虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。

在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前

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

定义子命名空间

namespace MyProject\Sub\Level;


MyProject\Sub\Level
与实际目录没有关系

\
而不是
/


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

<?php
namespace MyProject;

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

namespace AnotherProject;

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


不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法

<?php
namespace MyProject {

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

namespace AnotherProject {

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


在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。

使用命名空间

举个栗子

在同一目录下有如下文件

a.php
b.php
c.php
001.php


a.php

<?php
namespace x\y\z;

class People
{
public $name = 'this is people a';
}


b.php

<?php
namespace l\m\n;

class People
{
public $name = 'this is people b';
}


c.php

<?php

class People
{
public $name = 'this is people c';
}


001.php

<?php

require 'a.php';
require 'b.php';
require 'c.php';

$a = new x\y\z\People; // \x\y\z\People
$b = new l\m\n\People; // \l\m\n\People
$c = new People; // \People

echo $a->name . '<br>'; // this is people a
echo $b->name . '<br>'; // this is people b
echo $c->name; // this is people c


如果给001.php加上命名空间会报错

<?php

namespace o\k;

require 'a.php';
require 'b.php';
require 'c.php';

$a = new x\y\z\People; // \o\k\x\y\z\People
$b = new l\m\n\People; // \o\k\l\m\n\People
$c = new People; // \o\k\People


此时必须使用完全限定名称

<?php

namespace o\k;

require 'a.php';
require 'b.php';
require 'c.php';

$a = new \x\y\z\People; // \x\y\z\People
$b = new \l\m\n\People; // \l\m\n\People
$c = new \People; // \People

echo $a->name . '<br>'; // this is people a
echo $b->name . '<br>'; // this is people b
echo $c->name; // this is people c


全局空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此

在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称

别名/导入

为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名。

别名是通过操作符 use 来实现的

<?php
namespace foo;
use My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use ArrayObject;

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;
?>


一行中包含多个use语句

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: