设为首页 加入收藏

TOP

PHP的命名空间(一)
2019-09-17 16:47:41 】 浏览:37
Tags:PHP 命名 空间

1.什么是命名空间,官方文档定义为:

    什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

 

2.命名空间的作用,官方定义为:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读  

   其实命名空间的作用就是解决类、函数、常量重名的问题,变量名重复,可以放到不同的函数中,函数名重复可以放到不同的类中,那类名重复呢?就可以用命名空间解决

 

3.如何定义一个命名空间

namespace  xx;

  范围:从这一行开始到下一个命名空间的开始

  注意事项:在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前

 

  虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。

 

4.定义子命名空间

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

  <?php
  namespace MyProject\Sub\Level;

  const CONNECT_OK = 1;
  class Connection { /* ... */ }
  function connect() { /* ... */  }

  ?>

  上面的例子创建了常量MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection和函数 MyProject\Sub\Level\connect

 

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

  <?php
  namespace MyProject;

  const CONNECT_OK = 1;
  class Connection { /* ... */ }
  function connect() { /* ... */  }

  namespace AnotherProject;

  const CONNECT_OK = 1;
  class Connection { /* ... */ }
  function connect() { /* ... */  }

  ?>

  不建议使用这种语法在单个文件中定义多个命名空间,建议使用下面大括号的语法定义命名空间

  <?php
  namespace MyProject {

  const CONNECT_OK = 1;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
  }

  namespace AnotherProject {

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

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

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

  <?php

  declare(encoding='UTF-8');       //  除了开始的declare语句外,命名空间的括号外不得有任何PHP代码。
  namespace MyProject {

  const CONNECT_OK = 1;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
  }

  namespace { // global code
  session_start();
  $a = MyProject\connect();
  echo MyProject\Connection::start();
  }
  ?>

 

6.使用命名空间 

注明:

本文提到的常量:PHP5.3开始const关键字可以用在类的外部。const和define都是用来声明常量的(它们的区别不详述),但是在命名空间里,define的作用是全局的,而const则作用于当前空间。我在文中提到的常量是指使用const声明的常量。

命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的‘封装'的概念。

创建一个命名空间需要使用namespace关键字,这样:

复制代码代码如下:

&l
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇美团分布式服务通信框架及服务治.. 下一篇程序常用的设计技巧

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目