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