PHP命名空间
PHP命名空间在5.3中加入,主要是为了解决以下两类问题:
- 用户编写的代码与PHP内部的类/函数/常亮或第三方类/函数/常亮之间的名字冲突。
- 为长的标识符名称创建一个别名,提高代码的可读性。
定义命名空间
命名空间通过关键字namespace来声明,如果一个文件中包含命名空间就必须在所有代码之前声明。
<?php
namespace MyProject;
//代码
在一个文件中可以定义不同的空间代码
<?php
namespace MyProject1 {
//MyProject1空间
class a{/*...*/};
const b;
function c(){};
}
namespace MyProject2 {
//MyProjects空间
class a{/*...*/};
const b;
function c(){/*...*/};
}
namespace {
//全局代码部分
$a=MyProject1\c();
echo MyProject\a::d();
}
在声明命名空间之前的唯一合法代码是用于定义源文件编码方式的declare语句。所有非PHP代码包括空白字符都不能出现在命名空间的声明之前。
declare(encoding='UTF-8');
子命名空间
命名空间的名字可以使用分层次的方式定义:
namespace MyProject\Sub\Level;
命名空间的使用
有三种方式引入:
- 非限定名称,或不包含前缀的类名称。
- 限定名称,或包含前缀的名称。
- 完全限定名称,或包含了全局前缀操作符的名称。完全限定名称,或包含了全局前缀操作符的名称。
实例:
file1.php
<?php
namespace Foo\Bar\subnamespace;
const foo = 1;
function foo(){}
class foo
{
static function staticmethod(){}
}
file2.php
<?php
namespace Foo\Bar\
const FOO = 2;
function foo(){}
class foo
{
static function staticmethod(){}
}
/*非限定名称*/
foo();//解析为函数 Foo\Bar\foo
foo::staticmethod();//解析为类 Foo\Bar\foo,方法为staticmethod
echo FOO;//解析为常亮
/*限定名称*/
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo, 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO
/*完全限定名称*/
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO