首页 后端开发 php教程 PHP命名空间解析规则

PHP命名空间解析规则

Jul 29, 2016 am 09:12 AM
namespace new

PHP命名空间解析规则

命名空间名称定义

非限定名称Unqualified name

<code>名称中不包含命名空间分隔符的标识符,例如Foo
</code>
登录后复制

限定名称Qualified name

<code>名称中含有命名空间分隔符的标识符,例如:Foo\Bar
</code>
登录后复制

完全限定名称Fully qualified name

<code>名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如:\Foo\Bar.
namespace\Foo 也是一个完全限定名称。
</code>
登录后复制

名称解析遵循下列规则

  1. 对完全限定名称的函数,类和常量的调用在编译时解析。例如 new \A\B 解析为类 A\B。
  2. 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间 A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()。
  3. 在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间 A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e()。
  4. 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间 A\B\C 导入为C,则 new C() 被转换为 new A\B\C()。
  5. 在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的:
    1. 在当前命名空间中查找名为 A\B\foo() 的函数
    2. 尝试查找并调用 全局(global) 空间中的函数 foo()。
  6. 在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用 new C() 及 new D\E() 的解析过程:

    new C()的解析:

    1. 在当前命名空间中查找A\B\C类;

    2. 尝试自动装载类A\B\C。

    new D\E()的解析:

    1. 在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类

    2. 尝试自动装载类 A\B\D\E。

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

名称解析示例

<code><?php namespace A;
use B\D, C\E as F;

// 函数调用

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

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

my\foo();   // 调用定义在命名空间"A\my"中函数 "foo" 

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

// 类引用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>
</code>
登录后复制
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了PHP命名空间解析规则,包括了静态方法方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP8.0中的namespace合并 PHP8.0中的namespace合并 May 14, 2023 am 08:43 AM

随着技术的不断发展,PHP语言正在不断地更新和完善。PHP8.0作为最新版本的PHP语言,在功能上比之前的版本更加强大,其中一个重要的特性就是namespace合并。那么,namespace合并是什么呢?它又有什么用处?下面我们来详细探讨一下。namespace是PHP中一种用来区分不同代码的命名空间,它可以让我们在代码中使用同名类、函数或常量。在之前的版本

如何移除stickynotesnamespace 如何移除stickynotesnamespace Dec 27, 2023 pm 01:51 PM

我们在使用win7系统的时候,会发现有一个stickynotes工具。stickynotes其实就是类似于一个电子便签本一样的功能,如果想要删除字需要在控制面板中对其进行卸载即可。stickynotesnamespace是什么怎么删除方法一:找到--方法二:找到,在后面点击删除即可方法三:使用第三方软件进行粉碎删除StickyNotes是什么它是一个系统自带的便签工具,和便利贴类似能够悬浮在桌面上,方便用户们记下重要的事情。平时该软件处于影藏状态,如果有需要的话是可以在指定的时间跳出并提醒用户们

go语言中make和new的区别是什么 go语言中make和new的区别是什么 Jan 09, 2023 am 11:44 AM

区别:1、make只能用来分配及初始化类型为slice、map、chan的数据;而new可以分配任意类型的数据。2、new分配返回的是指针,即类型“*Type”;而make返回引用,即Type。3、new分配的空间会被清零;make分配空间后,会进行初始化。

java中的new关键字怎么使用 java中的new关键字怎么使用 May 03, 2023 pm 10:16 PM

1.概念在Java语言里,“new”表达式是负责创建实例的,其中会调用构造器去对实例做初始化;构造器自身的返回值类型是void,并不是“构造器返回了新创建的对象的引用”,而是new表达式的值是新创建的对象的引用。2.用途新建类的对象3.工作机制为对象成员分配内存空间,并指定默认值对成员变量进行显式初始化执行构造方法计算并返回引用值4.实例new操作往往意味着内存中的开辟新的内存空间,这个内存空间分配在内存中的堆区,受到jvm控制,自动进行内存管理。这里我们就是用String这个类来举例说明。pu

如何使用PHP7的NameSpace和Use关键字组织代码的结构? 如何使用PHP7的NameSpace和Use关键字组织代码的结构? Oct 19, 2023 am 08:07 AM

如何使用PHP7的NameSpace和Use关键字组织代码的结构?引言:在软件开发中,代码的组织结构是非常重要的,它直接关系到代码的可读性、可维护性和可扩展性。随着PHP版本的不断迭代,PHP7引入了NameSpace和Use关键字,这为我们提供了更多灵活性和便利性。本文将介绍如何使用PHP7的NameSpace和Use关键字来组织代码的结构,并提供具体的代

js中new操作符工作原理是什么 js中new操作符工作原理是什么 Feb 19, 2024 am 11:17 AM

js中new操作符工作原理是什么,需要具体代码示例js中的new操作符是用来创建对象的关键字。它的作用是根据指定的构造函数创建一个新的实例对象,并返回该对象的引用。在使用new操作符时,实际上进行了以下几个步骤:创建一个新的空对象;将该空对象的原型指向构造函数的原型对象;将构造函数的作用域赋给新对象(因此this指向了新对象);执行构造函数中的代码,并给新对

新款富士固定镜头 GFX 相机将首次推出新的中画幅传感器,可能开启全新系列 新款富士固定镜头 GFX 相机将首次推出新的中画幅传感器,可能开启全新系列 Sep 27, 2024 am 06:03 AM

近年来,富士胶片取得了很大的成功,这主要归功于其胶片模拟技术以及其紧凑型测距相机在社交媒体上的流行。然而,据 Fujirumors 称,它似乎并没有满足于现状。你

See all articles