命名空间
与c++一样,PHP命名空间也是封装项目的一种方式,这样可以在没有命名冲突的情况下重用相同的命名。
- 在许多地方,它可以被看作是一个抽象的概念。它允许在独立的命名空间中重新声明相同的函数/类/接口/常量函数,而不会出现致命错误。
- 命名空间是具有层次结构标记的代码块,用于保存常规PHP代码。
- 命名空间可以包含有效的PHP代码。
- 命名空间影响以下类型的代码:类(包括抽象和特性)、接口、函数和常量。
- 命名空间使用namespace关键字声明。
在任何其他代码之前,必须在文件顶部声明命名空间—只有一个例外:declare关键字。
1 2 3 4 5 6 7 8 9 10 | <?php namespace MyNamspaceName { // 常规PHP代码 function hello() { echo 'Hello I am Running from a namespace!'; } } ?> |
如果命名空间是全局声明的,则声明它时不带任何命名。
1 2 3 4 5 6 | <?php namespace { // 全局空间 } ?> |
可以在单个PHP代码中声明多个命名空间。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php namespace MyNamespace1 { } namespace MyNamespace2 { } namespace { } ?> |
命名空间用于避免定义冲突,并在代码库中引入更多的灵活性和组织性。与目录一样,命名空间可以包含称为子命名空间的层次结构。PHP使用反斜杠作为命名空间分隔符。
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php namespace MyNamespaceName; function hello() { echo 'Hello I am Running from a namespace!'; } // Resolves to MyNamespaceName\hello hello(); // Explicitly resolves to MyNamespaceName\hello namespace\hello(); ?> |
混叠在命名空间
导入是通过使用’ use ‘关键字实现的。可以选择,它可以用’ as ‘关键字指定自定义别名。
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php namespace MyNamespaceName; require 'project/database/connection.php'; use Project\Database\Connection as Connection; $connection = new Connection(); use Project\Database as Database; $connection = new Database\Connection(); ?> |
可以动态调用带有命名空间的代码,不支持动态导入。
1 2 3 4 5 6 7 8 9 10 11 | <?php namespace OtherProject; $title = 'sky8g'; // This is valid PHP require 'project/blog/title/' . $title . '.php'; // This is not use Project\Blog\title\$title; ?> |
Reference : http://php.net/manual/en/language.namespaces.php