前面的话

  从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。这个原理应用到程序设计领域就是命名空间的概念

  在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:一类是用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突;另一类是为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。PHP命名空间提供了一种将相关的类、函数和常量组合到一起的途径。本文将详细介绍PHP的命名空间

定义

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

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

  1. <?php
  2. namespace MyProject;
  3.  
  4. const CONNECT_OK = 1;
  5. class Connection { /* ... */ }
  6. function connect() { /* ... */ }
  7.  
  8. ?>

子命名空间

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

  1. <?php
  2. namespace MyProject\Sub\Level;
  3.  
  4. const CONNECT_OK = 1;
  5. class Connection { /* ... */ }
  6. function connect() { /* ... */ }
  7.  
  8. ?>
  1. <?php
  2. namespace MyProject\Sub\Level;
  3. const NUM = 1;
  4. echo NUM;//
  5. echo \MyProject\Sub\Level\NUM;//
  6. ?>

多命名空间

  可以在同一个文件中定义多个命名空间。在同一个文件中定义多个命名空间有两种语法形式

  在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中

【1】简单组合语法(不建议使用)

  1. <?php
  2. namespace MyProject;
  3.  
  4. const CONNECT_OK = 1;
  5. class Connection { /* ... */ }
  6. function connect() { /* ... */ }
  7.  
  8. namespace AnotherProject;
  9.  
  10. const CONNECT_OK = 1;
  11. class Connection { /* ... */ }
  12. function connect() { /* ... */ }
  13. ?>

【2】大括号语法

  1. <?php
  2. namespace MyProject {
  3.  
  4. const CONNECT_OK = 1;
  5. class Connection { /* ... */ }
  6. function connect() { /* ... */ }
  7. }
  8.  
  9. namespace AnotherProject {
  10.  
  11. const CONNECT_OK = 1;
  12. class Connection { /* ... */ }
  13. function connect() { /* ... */ }
  14. }
  15. ?>
  1. <?php
  2. namespace MyProject {
  3. const NUM = 1;
  4. }
  5.  
  6. namespace AnotherProject {
  7. const NUM = 2;
  8. echo NUM;//
  9. echo \MyProject\NUM;//
  10. }
  11. ?>

全局

  将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来 

  1. <?php
  2. namespace MyProject {
  3.  
  4. const CONNECT_OK = 1;
  5. class Connection { /* ... */ }
  6. function connect() { /* ... */ }
  7. }
  8.  
  9. namespace { // global code
  10. session_start();
  11. $a = MyProject\connect();
  12. echo MyProject\Connection::start();
  13. }
  14. ?>

名称解析

  非限定名称Unqualified name是指名称中不包含命名空间分隔符的标识符,例如 Foo

  限定名称Qualified name是指名称中含有命名空间分隔符的标识符,例如 Foo\Bar

  完全限定名称Fully qualified name是指名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称

  如果要动态访问元素(例如,变量函数),必须使用完全限定名称

  1. <?php
  2. namespace MyProject;
  3. function test(){
  4. echo '111';
  5. }
  6. $var1 = 'test';
  7. $var2 = '\MyProject\test';
  8. $var1();//报错
  9. $var2();/111
  10. ?>

访问内部元素

  PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字

  常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串

  1. <?php
  2. namespace MyProject;
  3. function test(){
  4. echo '111';
  5. }
  6. $var = __NAMESPACE__.'\test';
  7. $var();//
  8. ?>

  关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符

  1. <?php
  2. namespace MyProject;
  3. function test(){
  4. echo '111';
  5. }
  6. test();//
  7. __NAMESPACE__.test();//
  8. namespace\test();//
  9. ?>

全局空间

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

  1. <?php
  2. namespace A\B\C;
  3. /* 这个函数是 A\B\C\fopen */
  4. function fopen() {
  5. /* ... */
  6. $f = \fopen(...); // 调用全局的fopen函数
  7. return $f;
  8. }
  9. ?>

别名和导入

  php允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类unix文件系统中可以创建对其它的文件或目录的符号连接

  所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名

  在PHP中,别名是通过操作符 use 来实现的

别名

  1. <?php
  2. namespace hello\world\test;
  3. use hello\world\test as t;//用t来替代hello\world\test
  4. function demo(){
  5. echo '111';
  6. }
  7. t\demo();//
  8. ?>

  as可以省略

  1. <?php
  2. namespace hello\world\test;
  3. use hello\world\test;//用test来替代hello\world\test
  4. function demo(){
  5. echo '111';
  6. }
  7. test\demo();//
  8. ?>

导入

  1. <?php
  2. use \ArrayObject;
  3. $a = new ArrayObject([]);//若不使用"use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
  4. ?>

  为了简化,一行中可以包含多个use语句

  1. <?php
  2. use My\Full\Classname as Another, My\Full\NSname;
  3. $obj = new Another; // 实例化 My\Full\Classname 对象
  4. NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
  5. ?>

前端学PHP之命名空间的更多相关文章

  1. 前端学做 PPT

    前端学做 PPT 公司做技术分享.年终总结都需要用到ppt. 要快速.省事的做出高质量的 ppt,一方面需要熟练使用制作 ppt 的工具,另一方面得知道用工具做成什么样子才是好作品.前者比较简单,后者 ...

  2. 前端学HTTP之网络基础

    × 目录 [1]网络 [2]OSI [3]TCP/IP 前面的话 HTTP协议对于前端工程师是非常重要的.我们在浏览网站时,访问的每一个WEB页面都需要使用HTTP协议实现.如果不了解HTTP协议,就 ...

  3. 前端学HTTP之代理

    前面的话 Web代理(proxy)服务器是网络的中间实体,位于客户端和服务器之间,扮演“中间人”的角色,在各端点之间来回传送HTTP报文.本文将介绍HTTP代理服务器相关内容 中间实体 Web上的代理 ...

  4. 前端学HTTP之数据传输

    × 目录 [1]客户机处理 [2]集线器处理 [3]路由器1处理[4]路由器2处理[5]交换机处理[6]服务器处理[7]反向传输 前面的话 上一篇中,介绍了网络基础.本文将详细介绍客户机在浏览网页ab ...

  5. 前端学php之常量

    × 目录 [1]定义常量 [2]常量检测 [3]系统常量[4]魔术常量 前面的话 常量在javascript中并不存在,在php中却是与变量并列的重要内容.常量类似变量,但常量一旦被定义就无法更改或撤 ...

  6. 前端学PHP之自定义模板引擎

    前面的话 在大多数的项目组中,开发一个Web程序都会出现这样的流程:计划文档提交之后,前端工程师制作了网站的外观模型,然后把它交给后端工程师,它们使用后端代码实现程序逻辑,同时使用外观模型做成基本架构 ...

  7. 前端学PHP之Smarty模板引擎

    前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...

  8. 前端学Markdown

    前面的话   我个人理解,Markdown就是一个富文本编辑器语言,类似于sass对于css的功能,Markdown也可以叫做HTML预处理器,只不过它是一门轻量级的标记语言,可以更简单的实现HTML ...

  9. 前端学HTTP之web攻击技术

    前面的话 简单的HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源才是攻击目标.本文将详细介绍攻击web站点 ...

随机推荐

  1. NOIP2016普及

    还记得去年局部变量忘记置零coin爆零的事......结果我今年又要考一年普及[趴 最近沉迷分块莫队无法自拔,这几天才想起来我是个普及组选手 几乎没准备普及,周六上午抱抱佛脚好了...... 希望能顺 ...

  2. knockoutjs扩展与使用

    原来考虑使用avalon2.0 经过一周的试验,能力不够,用不起来.最终使用了knockout-3.4.js <!DOCTYPE html> <html> <head&g ...

  3. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  4. java 的各种实用类库(jar包)

    总列表:# dom4j # org.json # pinyin4j # sqlite-jdbc # JavaMail # JLayer # dom4j 介绍:处理 xml 的类库.采用了 Java 集 ...

  5. 初识linux

    1.版本 稳定版本:偶数版如2.6.X 发展中的版本:奇数版如2.5.X linux distribution包含:linux kernel + free software + documentati ...

  6. css实现一行文字居中,多行文字居左

    第一种方法: <style> *{margin:0;padding:0;} .box{width:500px;height:300px;border:1px solid #000;text ...

  7. Java序列化、反序列化和单例模式

    学习JAVA的时候,特别是涉及到网络编程时,我们时常让我们的实体类实现一个接口 public class Entity implements Serializable{ } 这样子我们可以通过输入输出 ...

  8. 【noip 2016】 蚯蚓(50分)(earthworm)

    50分小程序,写了2天- 题目在这里 一个单调队列,写的都是p=0的点,考试的时候要是弄到这些分的话--不说了-- 羡慕AC的神犇啊,54行的满分程序,而我-- #include <iostre ...

  9. java 过滤器Filter

    一.首先在web.xml里进行拦截过滤 <filter>        <filter-name>platformServiceAgreementFilter</filt ...

  10. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...