欢迎使用CSDN-markdown编辑器

来源:互联网 发布:prezi软件破解版 编辑:程序博客网 时间:2024/06/16 04:07

昨天在单位研究pthreads时,需要在框架里进行集成Thread,发现yaf一直报错,后来跟同事一起排查问题,竟然是因为定义了namespace导致的。
一直以来知道命名空间,但没怎么注意过,今天把命名空间进行总结下。

1什么是命名空间
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。(摘自php官方文档)
而我的理解:命名空间就是一个个家,每个家里的小孩都可以叫李明,放学回家时,李明会回到各自家中,不会出错
2为什么要用命名空间
上面讲了,如果没有命名空间,小朋友都叫李明,老师就没办法知道是那个家长来接孩子了

3受限
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。

4.实例
正确例子

<?phpnamespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }?>

错误例子

<html><?phpnamespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句?>

定义子命名空间

<?phpnamespace MyProject\Sub\Level;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */  }?>

PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:
非限定名称,或不包含前缀的类名称,例如 a=newfoo();foo::staticmethod();currentnamespacefoocurrentnamespace\foo使foofoofoo使/,a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,例如:

<?phpnamespace A\B\C;class Exception extends \Exception {}$a = new Exception('hi'); // $a 是类 A\B\C\Exception 的一个对象$b = new \Exception('hi'); // $b 是类 Exception 的一个对象$c = new ArrayObject; // 致命错误, 找不到 A\B\C\ArrayObject 类?>

哥们就哭死在这上面

0 0