命名空间其实早在PHP5.3就曾经呈现了。不过大部分同学可能在各种框架的应用中才会接触到命名空间的内容,当然,现代化的开发也都离不开这些可能疾速产出的框架。这次咱们不从框架的角度,仅从简略的代码角度来解析一下命名空间的概念和应用。

首先,咱们要定义命名空间是个什么货色。

其实就像操作系统的目录一样,命名空间就是为了解决相似于操作系统中同一个文件夹不能有雷同的文件名一样的问题。假如咱们只有一个文件,一个目录,那么在这个目录中,是不能有两个完全相同的文件的。如果有这样名称完全相同的文件,那么操作系统也不晓得咱们到底应该关上的是哪一个文件。同理,在一个PHP文件中,咱们也不能起雷同名称的函数或者类名,PHP也不晓得咱们到底要调用的是哪一个函数或者类。

了解了上述内容之后,再来看命名空间的语法,其实十分像咱们的目录的定义。

namespace A\B\C;

这个命名空间的定义就是指出了以后命名空间是A\B\C。就像是C:\A\B\C这样一个文件夹一样。光说不练假把式,间接上代码来看看:

// file1.php

namespace FILE1;

const CONST_A = 2;

function testA(){

echo 'FILE1\testA()', PHP_EOL;

}

class objectA{

function test(){

echo 'FILE1\ObjectA', PHP_EOL;

}

}

// file2.php

namespace FILE2;

const CONST_A = 3;

function testA(){

echo 'FILE2\testA()', PHP_EOL;

}

class objectA{

function test(){

echo 'FILE2\ObjectA', PHP_EOL;

}

}

咱们在namespace目录下创立了这两个php文件,函数和类名都是一样的,但定义了不同的命名空间,一个是FILE1,一个是FILE2。

namespace A;

include 'namespace/file1.php';

include 'namespace/file2.php';

use FILE1, FILE2;

use FILE1\objectA as objectB;

const CONST_A = 1;

function testA(){

echo 'A\testA()', PHP_EOL;

}

class objectA{

function test(){

echo 'A\ObjectA', PHP_EOL;

}

}

// 以后命名空间

echo CONST_A, PHP_EOL; // 1

testA(); // A\testA()

$oA = new objectA();

$oA->test(); // A\ObjectA

// FILE1

echo FILE1\CONST_A, PHP_EOL; // 2

FILE1\testA(); // FILE1\testA()

$oA = new FILE1\objectA();

$oA->test(); // FILE1\ObjectA

$oB = new objectB();

$oB->test(); // FILE1\ObjectA

// FILE2

echo FILE2\CONST_A, PHP_EOL; // 3

FILE2\testA(); // FILE2\testA()

$oA = new FILE2\objectA();

$oA->test(); // FILE2\ObjectA

在测试代码中,咱们又定义了以后的命名空间为A。并include了file1.php和file2.php。并在这个文件中同时也定义了与file1.php和file2.php中雷同的函数和类名。接下来咱们顺次调用这些动态变量、函数和类。

在默认状况下,动态变量、函数、类调用的是以后命名空间下的内容

在应用了FILE1\和FILE2\之后,调用的是就是指定命名空间下的内容

须要应用use引入命名空间,否则无奈应用命名空间里的内容

use中能够应用as关键字为命名空间或者其中的类指定别名

命名空间的应用其实就是这么的简略。能够看出咱们在不同的命名空间中就能够应用雷同的函数或者类名了。这一点正是各类现代化开发框架的根底。同时也是composer可能实现的最次要的起因之一。

接下来,咱们尝试一个问题是否合乎咱们的预期,那就是两个文件定义雷同的命名空间是否可能定义雷同的类名呢?

// file1-1.php

namespace FILE1;

const CONST_A = 1.1;

function testA(){

echo 'FILE1-1\testA()', PHP_EOL;

}

class objectA{

function test(){

echo 'FILE1-1\ObjectA', PHP_EOL;

}

}

咱们定义了一个file1-1.php,并且应用了和file1.php雷同的FILE1命名空间。而后和file1.php一起include到测试代码中。

include 'namespace/file1.php';

include 'namespace/file1-1.php'; // Cannot redeclare FILE1\testA()

好吧,在运行时间接就报错,不能反复定义同名的函数名。如果正文掉函数,那么会持续报类名不能反复。咱们再定义一个file1-2.php,这次还是应用FILE1这个命名空间,然而内容不一样了。

// file1-2.php

namespace FILE1;

const CONST_A = 1.2;

function testA1_2(){

echo 'FILE1-2\testA()', PHP_EOL;

}

class objectA1_2{

function test(){

echo 'FILE1-2\ObjectA', PHP_EOL;

}

}

这样当然就没问题啦。这两个文件在同一个命名空间下,然而却有着不同的能力,这样是齐全OK的操作。

include 'namespace/file1.php';

include 'namespace/file1-2.php';

use FILE1;

// FILE1

echo FILE1\CONST_A, PHP_EOL; // 2

FILE1\testA(); // FILE1\testA()

$oA = new FILE1\objectA();

$oA->test(); // FILE1\ObjectA

// FILE1_2

echo FILE1\CONST_A, PHP_EOL; // 3

FILE1\testA1_2(); // FILE1-2\testA()

$oA = new FILE1\objectA1_2();

$oA->test(); // FILE1-2\ObjectA

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%E5%AD%98%E5%9C%A8%EF%BC%9F%EF%BC%88%E4%B8%80%EF%BC%89.php

参考文档:

https://www.php.net/manual/zh/language.namespaces.rationale.php

https://www.php.net/manual/zh/language.namespaces.definition.php

===========

各自媒体平台均可搜寻【硬核项目经理】

php中命名空间重要吗,关于php:PHP中命名空间是怎样的存在一相关推荐

  1. 命名空间不能直接包含_C++程序中可以命名的5种元素

    C++程序中的许多元素都有用来表示它们的名称(也称为标识符).在C++程序中,可以命名的5种元素是: (1) 函数.函数是自包含的.可执行代码的命名块.第8章将详细讨论如何定义函数. (2) 变量.变 ...

  2. C++中函数重载、缺省参数及命名空间

    C++ 1 函数重载 缺省参数 概念 分类 全缺省参数 半缺省参数 面试题 命名空间 目的 定义命名空间 命名空间的使用 函数重载 当两个函数拥有相同的名字时,在c语言中发现无法生成 但是在c++中却 ...

  3. 修改Visual Studio中“添加新项”时默认添加的命名空间

    最近要修改一个以前开发的项目,项目中并没有运用Linq,但是我在VS2008中添加新项都会自动添加Linq命名空间,每次都要手动去删除很麻烦,就想想有没有办法可以修改这个"添加新项" ...

  4. 详解c++关键字。namespace命名空间的用法。实际开发中namespace应用场景。

    namespace 命名空间 要介绍namespace就先要讲明白c语言域的概念 域 什么是域呢?域就是变量作用的空间,在c++中,域被分为全局作用域和局部作用域. 一个域中的变量不能重名.不同域之间 ...

  5. C++ 命名空间 实战(一)嵌套的命名空间

    嵌套的命名空间 命名空间可以嵌套,您可以在一个命名空间中定义另一个命名空间,如下所示: namespace namespace_name1 {// 代码声明namespace namespace_na ...

  6. php命名空间规则解析及高级功能,PHP命名空间解析规则

    PHP 5.3加入命名空间特性之后,相信很多朋友在产品开发的中已经大量使用了, 不过其解析规则反正是让我纠结了一下子,不注意就会被搞晕,幸好在手册中发现这么一段代码, 故手册中其他关于namespac ...

  7. web.config中namespace的配置(针对页面中引用)

    web.config中namespace的配置(针对页面中引用) 1,在页面中使用强类型时: @model GZUAboutModel @using Nop.Admin.Models//命名空间(注意 ...

  8. K8S中的容器网络概述(编写中)

    目录 参考资料 一.什么是容器网络 1.1 网络命名空间 1.2 veth设备对 二.K8S中节点间通信 2.1 不同Node中的Pod之间通信 三.xx实现概述 参考资料 K8s网络模型 - 腾讯云 ...

  9. python中导入模块或包语句_Python中导入模块或包语句

    这篇文章作者主要讨论了Python的from import *和from import *,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意. 从一个模块导入全部 from import * m ...

最新文章

  1. 对于mysql存储过程感想_存储过程学习心得
  2. 主流NoSQL及应用场景详解
  3. flux服务器推消息,在Spring WebFlux响应式处理程序中发送JMS消息:它是否阻塞?
  4. 疫情之危,和两类无人车落地之机 | 创新工场“疫情后”系列分享
  5. OpenGL Viewport Array视口阵列的实例
  6. 张红英模型matlab,京师微课 | 北京市特级教师张红英:化学学科核心素养培养课例...
  7. 【专题介绍】开源与创新
  8. 【ubuntu-qt-dlib】 配置问题 (二) terminate called after throwing an instance of 'dlib::image_load_error'
  9. android 字体描边实现,android文字描边功能的实现
  10. Centos7.x Hadoop 3.x HDFS 写入文件
  11. 基于Redis实现的抢购代码示例
  12. Redis--发布订阅
  13. 内存泄漏分析小工具分享(基于UMDH)
  14. 运放搭建的窗口电压比较器电路
  15. cocos2d-x游戏开发 《坠入蔚蓝》
  16. 跟我学:1000句最常用英语口语
  17. Servlet的安全(第十三篇)
  18. 【源码】用主应力线(应力可视化)研究二维应力场
  19. 数据库四大特性ACID
  20. 数值方法笔记1:数字表示与误差分析

热门文章

  1. 3、leetcode 697 数组的度
  2. ajax学生校验学号,ajax校验数据库数据是否存在
  3. sql order by 降序_数仓面试|四个在工作后才知道的SQL密技
  4. centos vim 安装插件本质研究
  5. 小波变换如何去噪的思想
  6. 先考一键还是先学java_是先考C还是先考JAVA
  7. java如何理解继承性_理解 Java 的三大特性之继承
  8. Akka的Hello World(三)Actor失败处理
  9. Git SSH Key生成,配置到GitHub 并测试
  10. 笔记-组织级项目管理与大型项目管理-大型及复杂项目