命名空间
Posted John_leaf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命名空间相关的知识,希望对你有一定的参考价值。
一些关于命名空间的学习总结:
一、概述
具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
为解决
- 用户编写的代码与php内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
二、定义命名空间
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。命名空间通过关键字namespace 来声明。
1.如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。
2.另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。
三、同一个文件中定义多个命名空间
1.
2.
3.
四:使用命名空间:基础
类比文件系统的访问:
- 相对文件名形式如foo.txt。它会被解析为 currentdirectory/foo.txt,其中 currentdirectory 表示当前目录。因此如果当前目录是 /home/foo,则该文件名被解析为/home/foo/foo.txt。
- 相对路径名形式如subdirectory/foo.txt。它会被解析为 currentdirectory/subdirectory/foo.txt。
- 绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt。
使用示例:
<?php
namespace Foo\\Bar;
include \'file1.php\';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* 非限定名称 */
foo(); // 解析为 Foo\\Bar\\foo resolves to function Foo\\Bar\\foo
foo::staticmethod(); // 解析为类 Foo\\Bar\\foo的静态方法staticmethod。resolves to class Foo\\Bar\\foo, method staticmethod
echo FOO; // resolves to constant Foo\\Bar\\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
?>
2、
注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \\strlen() 或 \\Exception 或 \\INI_ALL。
五:命名空间和动态语言特性
略...用到再研究...
六:__namespace__关键字
常量__NAMESPACE__
的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
以上是关于命名空间的主要内容,如果未能解决你的问题,请参考以下文章