详细分析PHP 命名空间(namespace)

2020-06-30 19:00:05丽君

子命名空间

与目录和文件的关系很像,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:

<?php
namespace MyProjectSubLevel; //声明分层次的单个命名空间

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

?>

上面的例子创建了常量 MyProjectSubLevelCONNECT_OK,类 MyProjectSubLevelConnection 和函数 MyProjectSubLevelConnect。

命名空间使用

PHP 命名空间中的类名可以通过三种方式引用:

非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。 限定名称,或包含前缀的名称,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo。 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo。

下面是一个使用这三种方式的实例:

file1.php 文件代码

<?php
namespace FooBarsubnamespace; 

const FOO = 1;
function foo() {}
class foo
{
  static function staticmethod() {}
}
?>

file2.php 文件代码

<?php
namespace FooBar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
  static function staticmethod() {}
}

/* 非限定名称 */
foo(); // 解析为函数 FooBarfoo
foo::staticmethod(); // 解析为类 FooBarfoo ,方法为 staticmethod
echo FOO; // 解析为常量 FooBarFOO

/* 限定名称 */
subnamespacefoo(); // 解析为函数 FooBarsubnamespacefoo
subnamespacefoo::staticmethod(); // 解析为类 FooBarsubnamespacefoo,
                 // 以及类的方法 staticmethod
echo subnamespaceFOO; // 解析为常量 FooBarsubnamespaceFOO
                 
/* 完全限定名称 */
FooBarfoo(); // 解析为函数 FooBarfoo
FooBarfoo::staticmethod(); // 解析为类 FooBarfoo, 以及类的方法 staticmethod
echo FooBarFOO; // 解析为常量 FooBarFOO
?>

注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 strlen() 或 Exception 或 INI_ALL。

在命名空间内部访问全局类、函数和常量:

相关文章 大家在看