命名空间--名称解析规则

(PHP 5 >= 5.3.0, PHP 7)

PHP 命名空间中,类名可以通过三种方式引用:

  1. 非限定名称(Unqualified name),名称中不包含命名空间分隔符的标识符,如Foo

    例子 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是currentnamespace,foo 将被解析为currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 
  2. 限定名称(Qualified name),名称中含有命名空间分隔符的标识符,如 Foo\Bar。

    例子 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
  3. 完全限定名称,(Fully qualified name)名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称。

    例子 $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

名称解析遵循下列规则:

  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() 的调用是这样解析的:
    在当前命名空间中查找名为 A\B\foo() 的函数
    尝试查找并调用 全局(global) 空间中的函数 foo()。  
  6. 在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用 new C() 的解析过程:
    在当前命名空间中查找名为 A\B\foo() 的函数
    尝试查找并调用 全局(global) 空间中的函数 foo()。

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

时间: 2024-08-25 05:49:49

命名空间--名称解析规则的相关文章

PHP 面向对象编程和设计模式 (5) - PHP 命名空间的使用及名称解析规则

PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性. PH

【错误】未能找到类型或命名空间名称XXXX和未能解析引用的程序

“未能找到类型或命名空间名称XXXX”,以往遇到这种情况第一时间想到就是没有引用需要的dll.但今天我反复检查了好几次,还是没有解决问题.我注意到除了错误信息,还有几个警告信息“未能解析引用的程序集XXXXXXVersion=1.0.0.0, Culture=neutral, processorArchitecture=MSIL”,因为它对不在当前目标框架“.NETFramework,Version=v4.0,Profile=Client”中的“System.Web, Version=4.0.0

DNS(名称解析服务)

DNS and Bind ========================================================================= 概述: DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析).DNS协议运行在UDP协议之上,使用端口号53. 相关知

《TCP/IP 详解 卷1:协议》第 11 章:名称解析和域名系统

引言 到目前为止,我们使用 IP 地址来研究参与网络的主机.对于大众来说,这些地址太繁琐且难以记忆.为了使用如 TCP 和 IP 等协议,主机名称通过名为名称解析(name resolution)的过程转换成 IP 地址.在互联网中,存在着不同形式的名称解析,其中最普遍.最重要的是域名系统(Domain Name System,DNS). DNS 是一种分布式数据库系统,是一种典型的客户端/服务器模型的网络数据库.TCP/IP 应用程序使用它来完成主机名称和 IP 地址的映射."分布式"

nsswitch:名称解析服务

App->nsswitch->resolve_lib libnss /etc/nsswitch.conf主配置文件 # Example: #passwd:    db files nisplus nis #shadow:    db files nisplus nis #group:     db files nisplus nis passwd:     files shadow:     files group:      files #hosts:     db files nisplu

C 和C++ 名称修饰规则

C名称修饰规则 1.对于使用__cdecl调用约定的函数,在函数名称前加一下划线,不考虑参数和返回值. 2.对于使用__fastcall调用约定的函数,在函数名称前后各加一@符号,后跟参数的长度,不考虑返回值. 例如 extern “C” int __fastcall Test(int n)的修饰名称为@[email protected] 3.对于使用 __stdcall 标准调用约定的函数,在函数名称前加一下划线,名称后加一@符号,后跟参数的长度,不考虑返回值. 例如 extern “C” i

"命名空间"system.web"中不存在类型或命名空间名称security"错误解决方法

using System; using System.Collections.Generic; using System.Text; using System.Web; namespace 求md5 { class Program { static void Main(string[] args) { string str = GetMd5("xuwei"); Console.WriteLine(str); } public static string GetMd5(string st

SVN权限解析规则详解

最近在做一个操作SVN的Web系统,涉及到了很多东西,包括apache执行命令.配置文件解析等:编码过程中发现svn的权限解析过程和我所了解到的不大相同,在网上查了一些资料,但好像都是怎么配置svn,没有详细讲解权限的生效过程,而我开发系统需要考虑到各种情况,所以我自己通过一部分资料和动手实验总结了下面的svn权限解析规则.如果这些内容不是很全面或者有错误,可以提出来,我也会在后面修改补充. 首先创建一个版本库后,会生成最初的目录结构和基本的配置文件,本文主要分析“authz”文件的内容:我们先

c#找不到类型或命名空间名称“Word”

c#找不到类型或命名空间名称"Word" 2012-10-10 11:17:33|  分类: VC#技术|举报|字号 订阅 using Word = Microsoft.Office.Interop.Word; 添加引用word的相关dll,方法: 解决方案资源管理器-你的工程-引用右键-添加引用-COM找到Office的类库确定c#找不到类型或命名空间名称"Word",布布扣,bubuko.com