命名空间的概念及作用 java 命名空间是什么

天天见闻 天天见闻 2024-03-16 综合 阅读: 21
摘要: 它在不同命名空间中的含义是互不相干的。看一个定义和使用命名空间的示例:从语法上来讲,PHP支持在一个文件中定义多个命名空间,但是不推荐这种代码组织方式。此时,思考一下,在PHP内核中,命名空间的定义是如何实现的呢?这也是命名空间仅对类、常量和函数有效的原因。

79-命名空间

在维基百科中,对命名空间的定义是: 命名空间(英语:)表示标识符()的上下文()。一个标识符可在多个命名空间中定义, 它在不同命名空间中的含义是互不相干的。在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域内的标识符, 且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。 函数和类的作用域可被视作隐式命名空间,它们和可见性、可访问性和对象生命周期不可分割的联系在一起。

命名空间可以看作是一种封装事物的方法,同时也可以看作是组织代码结构的一种形式,在很多语言中都可以见到这种抽象概念和组织形式。 在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

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

PHP从5.3.0版本开始支持命名空间特性。看一个定义和使用命名空间的示例:

如上所示,定义了命名空间tipi,在这个命名空间内定义了一个类,一个E_ALL常量和一个函数。 这些类、常量和函数PHP默认已经实现。假如没有这个命名空间,声明这些类、常量或函数时会报函数重复声明或类重复声明的错误, 并且常量的定义也不会成功。

从PHP语言来看,命名空间通过 关键字定义,在命名空间内,可以包括任何合法的PHP代码,但是它的影响范围仅限于类、常量和函数。 从语法上来讲,PHP支持在一个文件中定义多个命名空间,但是不推荐这种代码组织方式。 当需要将全局的非命名空间中的代码与命名空间中的代码组合在一起,全局代码必须用一个不带名称的 语句加上大括号括起来。

此时,思考一下,在PHP内核中,命名空间的定义是如何实现的呢? 当在多个命名空间中存在多个相同的函数或类时,如何区分? 命名空间内的函数如何调用?

命名空间的定义

命名空间在PHP中的实现方案比较简单,不管是函数,类或者常量, 在声明的过程中都将命名空间与定义的函数名以\合并起来,作为函数名或类名存储在其对应的容器中。 如上面示例中的类,最后存储的类名是tipi\。 对于整个PHP实现的架构来说,这种实现方案的代价和对整个代码结构的调整都是最小的。

下面我们以类为例说明整个命名空间的实现。 命名空间实现的关键字是,从此关键字开始我们可以找到在编译时处理此关键字的函数为 ace。 在此函数中,关键是在对CG()的赋值操作,这个值在后面类声明或函数等声明时都会有用到。

在前面我们讲过,类声明的实现在编译时会调用Zend/.c文件中的函数, 在此函数中对于命名空间的处理代码如下:

if (CG(current_namespace)) {
    /* Prefix class name with name of current namespace */
    znode tmp;
    tmp.u.constant = *CG(current_namespace);
    zval_copy_ctor(&tmp.u.constant);
    zend_do_build_namespace_name(&tmp, &tmp, class_name TSRMLS_CC);
    class_name = &tmp;
    efree(lcname);
    lcname = zend_str_tolower_dup(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant));
}

这段代码的作用是如果当前存在命名空间,则给类名加上命名空间的前缀, 如前面提到示例中的tipi\类,添加tipi\的操作就是在这里执行的。 在函数中最终会调用ame函数实现类名的合并。 在函数和常量的声明中存在同样的名称合并操作。这也是命名空间仅对类、常量和函数有效的原因。

使用命名空间

以函数调用为例,当需要调用函数时,会调用函数。 在此函数中,当使用到命名空间时会检查函数名,其调用的函数为。 在函数中会根据类型作出判断并返回相关结果:

完全限定名称的函数: 程序首先会做此判断,其判断的依据是第一个字符是否为”\”,这种情况下,在解析时会直接返回。 如类似于\这样以\开头的全局调用或类似于前面定义的\tipi\调用。所有的非限定名称和限定名称(非完全限定名称):根据当前的导入规则 程序判断是否为别名,并从编译期间存储别名的中取出对应的命名空间名称,将其与现有的函数名合并。 关于别名的存储及生成在后面的内容中会说明,在命名空间内部: 所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。最后判断是否在当前命名空间, 最终程序都会返回一个合并了命名空间的函数名。别名/导入

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

PHP不支持导入函数或常量。

在PHP中,别名是通过操作符 use 来实现的。从而我们可以从源码中找到编译时调用的函数是。 别名在编译为中间代码过程中存放在CG()中,这是一个。 整个函数的实现基本上是一个查找,判断是否错误,最后写入到的过程。 其中针对命名空间和类名都有导入的处理过程,而对于常量和函数来说却没有, 这就是PHP不支持导入函数或常量的根本原因所在。

其他相关
PHP 中的逻辑运算符 – 初学者指南

PHP 中的逻辑运算符 – 初学者指南

作者: 天天见闻 时间:2023-10-17 阅读: 51
逻辑运算符在编程语言中起着重要的作用。它们允许您操作布尔值来评估逻辑条件。 PHP有四个基本逻辑运算符:AND、OR、NOT和XOR。本手册可以帮助您理解这些运算符。我将使用代码示例和实际用例来说明工作原理。 逻辑和运算符 AND运算符的写法类似于“”,只有当这两个操作数为true时,其计算结果才为true。如果任何操作数都是假的,其计算结果就是假的,就是错误的结果。 该运算符通常用于在if语句或循环中组合多个条件。它有助于确保所有条件都得到满足,以使总体条件真正。...
从PHP到Java。有什么建议吗?

从PHP到Java。有什么建议吗?

作者: 天天见闻 时间:2023-03-15 阅读: 118
如何解决从PHP到Java。与PHP -rJava 相似,但提供了更多信息。Java的在线文档是精确,专业的,并且在色调和格式上保持一致。与PHP中的所有功能都位于一个统一的命名空间中不同,Java中的标准库是类层次结构。在更新代码等时,不进行响应,关闭和重新启动Java进程,而将中断降到最低。我现在快要尝试Java。我现在想传达这种经验并将其用于Java开发。PHP开发人员使用Java的一些陷阱。...
PHP程序员容易忽略的几点精华是什么?

PHP程序员容易忽略的几点精华是什么?

作者: 天天见闻 时间:2022-07-15 阅读: 339
我发现很多的PHP程序员,尤其是学习还不是很久的,都不知道PHP的精华所在。Perl当年如何在商界出名?其强大的正则表达式。他是一门从Unix下发展起来的语言,当然也就继承了Perl的很多特点,同时C的优点都有。快速、简洁、明了,尤其是C程序员,PHP是至爱,我就是深爱着“PHP”)。这里,我想来写一篇PHP的变量、数组应用技巧和PHP的正则表达式、PHP的模板应用,以后有时间再写PHP 与COM、PHP与XML的完全结合。而主流的PHP如何做到呢?...
如何在 PHP 中创建换行符?

如何在 PHP 中创建换行符?

作者: 天天见闻 时间:2022-02-23 阅读: 1711
它是 PHP 的一个内置函数,用于在字符串中的所有换行符之前插入 HTML 换行符。虽然,我们也可以在源代码中使用 PHP 换行符\n或\r\n来创建换行符,但是这些换行符在浏览器上是不可见的。因此,nl2br() 在这里很有用。nl2br() 函数包含这些换行符 \n 或 \r\n 组合创建换行符。单独的 "\n" 和 "\r\n" 不足以在字符串中创建换行符,因为整个字符串显示在一行中。为了安全起见,请改用“\r\n”字符来创建换行符。...
关于发票盖章,你不可不知的十个注意事项

关于发票盖章,你不可不知的十个注意事项

作者: 天天见闻 时间:2022-02-21 阅读: 2498
前几日乘车,我取得了一张增值税电子普通发票,开票员先是很认真地帮我打印出来,然后又郑重地在上面盖了一个发票专用章。我们会计交代过,发票一定要盖章的。有关盖章的注意事项一共有十条:。曾经发票是允许盖财务专用章的,自2011年2月1日,修订的发票管理办法实施后,明确了发票只能盖发票专用章,财务专用章、公章都不可以。...
KBS新剧《囚犯医生》权娜拉变身精神科医生,锐利眼神展现专业优质

KBS新剧《囚犯医生》权娜拉变身精神科医生,锐利眼神展现专业优质

作者: 天天见闻 时间:2022-02-27 阅读: 822
《囚犯医生》权娜拉的剧照首次公开。将于3月20日首播的KBS 2TV新水木剧《囚犯医生》,讲述的是在被大型医院驱逐的天才医生奈杰成为教导所医疗科长之后,展开了生死搏斗的新概念监狱医疗悬疑剧。权娜拉在剧中饰演精神科医生“韩素琴”(音)一角。《囚犯医生》将接档目前正在播出的《为何那样,奉尚先生》,于3月20日晚上10点首播。...
我来说两句

年度爆文