小编带你学命名空间的调用顺序

上一篇文章中我们了解了访问命名空间内部元素,有需要的请看《小编带你了解如何访问命名空间内部元素(php版)》。这次我们向大家介绍命名空间的顺序,有需要的可以参考参考。

首先让我们看一个小例子。

<?php
namespace A;
use BD, CE as F;

// 函数调用

foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()
            // 再尝试调用全局函数 "foo"

foo();     // 调用全局空间函数 "foo" 

myfoo();   // 调用定义在命名空间"Amy"中函数 "foo" 

F();        // 首先尝试调用定义在命名空间"A"中的函数 "F" 
            // 再尝试调用全局函数 "F"

// 类引用

new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象
            // 如果未找到,则尝试自动装载类 "AB"

new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
            // 如果未找到,则尝试自动装载类 "BD"

new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
            // 如果未找到,则尝试自动装载类 "CE"

new B();   // 创建定义在全局空间中的类 "B" 的一个对象
            // 如果未发现,则尝试自动装载类 "B"

new D();   // 创建定义在全局空间中的类 "D" 的一个对象
            // 如果未发现,则尝试自动装载类 "D"

new F();   // 创建定义在全局空间中的类 "F" 的一个对象
            // 如果未发现,则尝试自动装载类 "F"

// 调用另一个命名空间中的静态方法或命名空间函数

Bfoo();    // 调用命名空间 "AB" 中函数 "foo"

B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
            // 如果未找到类 "AB" ,则尝试自动装载类 "AB"

D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
            // 如果类 "BD" 未找到,则尝试自动装载类 "BD"

Bfoo();   // 调用命名空间 "B" 中的函数 "foo" 

B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法
            // 如果类 "B" 未找到,则尝试自动装载类 "B"

// 当前命名空间中的静态方法或函数

AB::foo();   // 调用命名空间 "AA" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "AAB" 未找到,则尝试自动装载类 "AAB"

AB::foo();  // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "AB" 未找到,则尝试自动装载类 "AB"
?>

仔细观察上面的小例子,我们可以观察到什么?当当当,我们现在就给出答案。

在函数调用的时候,如果我们只写了“foo()”,先调用的命名空间中的函数,然后在调用全局函数;但如果是“foo()”,这就只调用全局函数了。

在类应用的时候,如果我们写了“new B();”,将会创建命名空间中定义的类"B"的一个对象,但如果未找到,则尝试自动装载类"AB"。

在调用另一个命名空间中的静态方法或命名空间函数的时候,如何我们写了“Bfoo()”,这表明我们将调用命名空间中的函数“foo()”;但如果写的是“B::foo();”就不一样了,他先调用命名空间中的函数“foo()”,但如果未找到,则尝试自动装载类"AB"。

在当前命名空间中的静态方法或函数的时候,如何我们写了“AB::foo();”,这表明我们会调用命名空间 "AA" 中定义的类 "B" 的 "foo" 方法,在没有找到的情况下,自动装载类 "AAB"。

现在让我们归纳一下。

  • 完全限定函数、类和常量的调用将会在编译的时候解析。例如,newaB解析为类aB。

  • 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译的时候进行转换。例如,如果命名空间 ABC 被导入为 C,那么对 CDe() 的调用就会被转换为 ABCDe()。

  • 所有非限定名和限定名(非完全限定名)都在编译时根据当前导入规则进行转换。例如,如果命名空间aBC作为C导入,则对CDe()的调用将转换为aBCDe()。

  • 非限定类名在编译时根据当前导入规则进行转换(将短导入名替换为全名)。例如,如果命名空间aBC作为C导入,则新的C()将转换为新的aBC()。

  • 在命名空间(例如,a)中,对非限定名称的函数调用在运行时解析。例如,对函数foo()的调用解析如下:

    • 在当前命名空间中查找名为 ABfoo() 的函数

    • 尝试查找并调用 全局(global) 空间中的函数 foo()。

  • 对命名空间(如a)内的非限定名或限定名类(非完全限定名)的调用在运行时解析。以下是调用new c()和new de()的解析过程:解析new c():

    • 在当前命名空间中查找ABC类。

    • 尝试自动装载类ABC。

  • new DE()的解析:

    • 在类名称前面加上当前命名空间名称变成:ABDE,然后查找该类。

    • 尝试自动装载类 ABDE。

  • 为了引用全局命名空间中的全局类,必须使用完全限定名称 new C()。

就说到这里了,有其他想知道的,可以点击这个哦。→ →php视频教程

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 小编带你学命名空间的调用顺序