PHP内核-命名空间的技巧分享

黄舟
黄舟 原创
2023-03-06 13:14:01 961浏览

在维基百科中,对命名空间的定义是: 命名空间(英语:Namespace)表示标识符(identifier)的上下文(context)

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


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

1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。


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


<?php
namespace tipi;
class Exception {
    public static $var = 'think in php internal';
}
 
const E_ALL = "E_ALL IN Tipi";
 
function strlen(){
    echo 'strlen in tipi';
}
 
echo Exception::$var;
echo strlen(Exception::$var);

1.示例:



2.命名空间的定义


3.命名空间的使用

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

1.完全限定名称的函数: 程序首先会做此判断,其判断的依据是第一个字符是否为"\",这种情况下,在解析时会直接返回。 如类似于\strlen这样以\开头的全局调用或类似于前面定义的\tipi\Exception调用。

2.所有的非限定名称和限定名称(非完全限定名称):根据当前的导入规则 程序判断是否为别名,并从编译期间存储别名的HashTable中取出对应的命名空间名称,将其与现有的函数名合并。 关于别名的存储及生成在后面的内容中会说明,

3.在命名空间内部: 所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。最后判断是否在当前命名空间, 最终程序都会返回一个合并了命名空间的函数名。

4.别名/导入

允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。

这有点类似于在类 unix 文件系统中可以创建对其它的文件或目录的符号连接。 PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。


以上就是PHP内核-命名空间的技巧分享的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。