在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的。可以将 PHP 命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
下面是一个使用这三种方式的实例:
file1.php file2.php
<?php
namespace FooBarsubnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
<?php
namespace FooBar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* 非限定名称 */
foo(); // 解析为 FooBarfoo resolves to function FooBarfoo
foo::staticmethod(); // 解析为类 FooBarfoo的静态方法staticmethod。resolves to class FooBarfoo, method staticmethod
echo FOO; // resolves to constant FooBarFOO
/* 限定名称 */
subnamespacefoo(); // 解析为函数 FooBarsubnamespacefoo
subnamespacefoo::staticmethod(); // 解析为类 FooBarsubnamespacefoo,
// 以及类的方法 staticmethod
echo subnamespaceFOO; // 解析为常量 FooBarsubnamespaceFOO
/* 完全限定名称 */
FooBarfoo(); // 解析为函数 FooBarfoo
FooBarfoo::staticmethod(); // 解析为类 FooBarfoo, 以及类的方法 staticmethod
echo FooBarFOO; // 解析为常量 FooBarFOO
?>
注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如
strlen() 或 Exception 或
INI_ALL。
Example #1 在命名空间内部访问全局类、函数和常量
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = strlen('hi'); // 调用全局函数strlen
$b = INI_ALL; // 访问全局常量 INI_ALL
$c = new Exception('error'); // 实例化全局类 Exception
?>