PHP命名空间

PHP命名空间

PHP命名空间在5.3中加入,主要是为了解决以下两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常亮或第三方类/函数/常亮之间的名字冲突。
  2. 为长的标识符名称创建一个别名,提高代码的可读性。

定义命名空间

命名空间通过关键字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;

命名空间的使用

有三种方式引入:

  1. 非限定名称,或不包含前缀的类名称。
  2. 限定名称,或包含前缀的名称。
  3. 完全限定名称,或包含了全局前缀操作符的名称。完全限定名称,或包含了全局前缀操作符的名称。
    实例:
    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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章