1:命名空间的命名不区分大小写

2:namespace必须在所有代码之前,除了declare语法以外(不过他之前可以有注释,空行等)

3:只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

4:如果你需要定义一个常量只在当前命名空间中,定义的时候要加上命名空间前缀,否则定义的是存在于全局命名空间的常量

例子:

The following code will define the constant "MESSAGE" in the global namespace (i.e. "\MESSAGE").

  1. namespace test;
  2. define('MESSAGE', 'Hello world!');

The following code will define two constants in the "test" namespace.

  1. namespace test;
  2. define('test\HELLO', 'Hello world!');
  3. define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
  1. <?php
  2. namespace NS;
  3.  
  4. define(__NAMESPACE__ .'\foo','111');
  5. define('foo','222');
  6.  
  7. echo foo; // 111.
  8. echo \foo; // 222.
  9. echo \NS\foo // 111.
  10. echo NS\foo // fatal error. assumes \NS\NS\foo.
  11. ?>

5:The namespace hierarchy will normally mirror the directory hierarchy where the class files are located, but this is not a strict requirement. You could, for example, have several class flles with different namespaces in the same directory.

6: \ABC\__DOMAIN__ 和  ABC\__COMAIN__的区别

\ABC\__DOMAIN__指的是以根命名空间为起点的,而不加\默认以当前所在文件的命名空间为起点, 解析时会默认加上当前文件的命名空间

这个同文件系统的相对路径和绝对路径

  1. baseTest.php
  1. <?php
  2. namespace ABC;
  3. const __DOMAIN__ = 'example.com';

test.php

  1. <?php
  2. namespace ABC\SUBLEVEL;
  3. require 'baseTest.php';
  4. echo \ABC\__DOMAIN__; //输出example.com (测试一:加\)

测试二(不加\)

  1. <?php
  2. namespace ABC\SUBLEVEL;
  3. require 'baseTest.php';
  4. const __DOMAIN__ = 'self.com';
  5. echo ABC\__DOMAIN__; //输出example.com

7:注意在命名空间中用exception类时

  1. <?php
  2.  
  3. namespace Foo;
  4.  
  5. try {
  6. // Something awful here
  7. // That will throw a new exception from SPL
  8. }
  9. catch (Exception as $ex) {
  10. // We will never get here
  11. // This is because we are catchin Foo\Exception
  12. }
  13. ?>
  14.  
  15. Instead use fully qualified name for the exception to catch it
  16.  
  17. <?php
  18.  
  19. namespace Foo;
  20.  
  21. try {
  22. // something awful here
  23. // That will throw a new exception from SPL
  24. }
  25. catch (\Exception as $ex) {
  26. // Now we can get here at last
  27. }
  28. ?>

8:一个文件中的内容的命名空间与include包含无关,只跟当前的文件有关

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。

  1. Included files will default to the global namespace.
  2. <?php
  3. //test.php
  4. namespace test {
  5. include 'test1.inc';
  6. echo '-',__NAMESPACE__,'-<br />';
  7. }
  8. ?>
  9.  
  10. <?php
  11. //test1.inc
  12. echo '-',__NAMESPACE__,'-<br />';
  13. ?>
  14.  
  15. Results of test.php:
  16.  
  17. --
  18. -test-

9:

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

对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。

  1. <?php
  2. namespace A\B\C;
  3. class Exception extends \Exception {}
  4.  
  5. $a = new Exception('hi'); // $a 是类 A\B\C\Exception 的一个对象
  6. $b = new \Exception('hi'); // $b 是类 Exception 的一个对象
  7.  
  8. $c = new ArrayObject; // 致命错误, 找不到 A\B\C\ArrayObject 类
  9. ?>
  1. <?php
  2. namespace A\B\C;
  3.  
  4. const E_ERROR = 45;
  5. function strlen($str)
  6. {
  7. return \strlen($str) - 1;
  8. }
  9.  
  10. echo E_ERROR, "\n"; // 输出 "45"
  11. echo INI_ALL, "\n"; // 输出 "7" - 使用全局常量 INI_ALL
  12.  
  13. echo strlen('hi'), "\n"; // 输出 "1"
  14. if (is_array('hi')) { // 输出 "is not array"
  15. echo "is array\n";
  16. } else {
  17. echo "is not array\n";
  18. }
  19. ?>

10:相同的命名空间不能出现在一个文件中,但是包含进来的相同命名空间则没问题

file1.php

  1. <?php
  2. namespace my\stuff;
  3. class MyClass {}
  4. ?>

another.php

  1. <?php
  2. namespace another;
  3. class thing {}
  4. ?>

file2.php

  1. <?php
  2. namespace my\stuff;
  3. include 'file1.php';
  4. include 'another.php';
  5.  
  6. use another\thing as MyClass;
  7. $a = new MyClass; // instantiates class "thing" from namespace another
  8. ?>

There is no name conflict, even though the class MyClass exists within the my\stuff namespace, because the MyClass definition is in a separate file. However, the next example causes a fatal error on name conflict because MyClass is defined in the same file as the use statement.

  1. <?php
  2. namespace my\stuff;
  3. use another\thing as MyClass;
  4. class MyClass {} // fatal error: MyClass conflicts with import statement
  5. $a = new MyClass;
  6. ?>

11:嵌套的命名空间不允许

  1. <?php
  2. namespace my\stuff {
  3. namespace nested {
  4. class foo {}
  5. }
  6. }
  7. ?>

However, it is easy to simulate nested namespaces like so:

  1. <?php
  2. namespace my\stuff\nested {
  3. class foo {}
  4. }
  5. ?>

12:动态命名空间的名字需要主要反斜线的转义

  1. <?php
  2. $a = new "dangerous\name"; // \n is a newline inside double quoted strings!
  3. $obj = new $a;
  4.  
  5. $a = new 'not\at\all\dangerous'; // no problems here.
  6. $obj = new $a;
  7. ?>

注意:Inside a single-quoted string, the backslash escape sequence is much safer to use, but it is still recommended practice to escape backslashes in all strings as a best practice.

13:常量如果没有定义,则返回notice错误,默认常量的值设置成和它的名字一样

  命名空间如果没有定义,则返回fatal错误

  1. <?php
  2. namespace bar;
  3. $a = FOO; // produces notice - undefined constants "FOO" assumed "FOO";
  4. $a = \FOO; // fatal error, undefined namespace constant FOO
  5. $a = Bar\FOO; // fatal error, undefined namespace constant bar\Bar\FOO
  6. $a = \Bar\FOO; // fatal error, undefined namespace constant Bar\FOO
  7. ?>

php分享二十九:命名空间的更多相关文章

  1. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  2. VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器

    VMwarevSphere 服务器虚拟化之二十九  桌面虚拟化之安装View副本服务器 VMware View中高可用性可是一个必须要考虑的问题.在整个虚拟桌面环境中View Connection S ...

  3. Citrix服务器虚拟化之二十九 XenApp 6.5发布服务器上的应用程序

    Citrix服务器虚拟化之二十九  XenApp 6.5发布服务器上的应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务 ...

  4. 剑指Offer(二十九):最小的K个数

    剑指Offer(二十九):最小的K个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  5. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  6. WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

    原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...

  7. Bootstrap入门(二十九)JS插件6:弹出框

    Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...

  8. mysql进阶(二十九)常用函数

    mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...

  9. JAVA之旅(二十九)——文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习

    JAVA之旅(二十九)--文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习 我们继续学习File 一.文件递归 我们可以来实现 ...

随机推荐

  1. 安装MySQL-python报错:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory或者 build\lib.win-amd64-2.7\_mysql.pyd : fatal error LNK1120: 56 unresolved externa

    解决办法1: 直接下载MySQL-python-1.2.5.win-amd64/32-py2.7.exe,点击安装 此处要注意自己安装的Python和MySQL版本是64位还是32位,否则在进行安装M ...

  2. mint 设置无线 AP

    所需软件: sudo apt-get install hostapd 1. 创建 hostapd 的 configure 文件 新建 hostapd.conf 文件,存放位置任意,与后面修改的路径一致 ...

  3. React学习笔记一:入门知识概览

    一:安装react 1:直接下载react源码包,把需要用到的js文件引入自己的页面即可. 2:BootCDN 的 React CDN 库: 在页面代码中导入即可: <head> < ...

  4. Javascript中类型的判断

    数据类型的判断有这么几种方式 1.一元运算符 typeOf 2.关系运算符 instanceof 3.constructor 属性 4.prototype属性 一.typeof typeof的返回值有 ...

  5. firefox插件卸载

    1.根据插件名进行搜索,搜索到相关dll后删除,重启firefox. 2.about:config--plugin.expose_full_path:true,然后about:plugins去查看插件 ...

  6. hihocoder217周 树形DP

    题目链接 一棵树,树中包含TRUE.FALSE.AND.OR四种结点,其中TRUE和FALSE是叶子结点,AND和OR结点的儿子包含多个结点,现在要求执行最少次数的以下操作: 把AND变成OR 把OR ...

  7. 你想要的iOS 小技巧总结

    UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(, , ...

  8. iphone 恢复出厂设置方法

    1.下载安装并打开itunes. 2.让手机进入恢复模式: 一.先长按住电源键,出现关机选项时,请滑动关机: 二.随后再按电源键开机,屏幕会出现苹果标志,不要松开电源键: 三.接着再按住主屏 Home ...

  9. POJ 2976 Dropping tests (0/1分数规划)

    Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4654   Accepted: 1587 De ...

  10. mysql5.7忘记密码时,修改root密码

    (1).由于MySQL5.7在安装完后,第一次启动时,会在root目录下生产一个随机的密码,文件名为 .mysql_secret 所以,登录时需要用随机密码登录,然后通过以下命令修改密码 “SET P ...