zoukankan      html  css  js  c++  java
  • 命名空间--名称解析规则

    (PHP 5 >= 5.3.0, PHP 7)

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

    1. 非限定名称(Unqualified name),名称中不包含命名空间分隔符的标识符,如Foo
      例子 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是currentnamespace,foo 将被解析为currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 
    2. 限定名称(Qualified name),名称中含有命名空间分隔符的标识符,如 FooBar。
      例子 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果当前的命名空间是currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo。
    3. 完全限定名称,(Fully qualified name)名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 FooBar namespaceFoo 也是一个完全限定名称。
      例子 $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo。

    名称解析遵循下列规则:

    1. 对完全限定名称的函数,类和常量的调用在编译时解析。例如 new AB 解析为类 AB

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

    3. 在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间 AB 内部调用 CDe(),则 CDe() 会被转换为 ABCDe() 。

    4. 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间 ABC 导入为C,则 new C() 被转换为 new ABC() 

    5. 在命名空间内部(例如AB),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的:

      在当前命名空间中查找名为 ABfoo() 的函数
      尝试查找并调用 全局(global) 空间中的函数 foo()。  
    6. 在命名空间(例如AB)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用 new C() 的解析过程:

      在当前命名空间中查找名为 ABfoo() 的函数
      尝试查找并调用 全局(global) 空间中的函数 foo()。

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

  • 相关阅读:
    模板笔记2
    模板笔记
    qt打包可执行文件
    合并单独的视频和音频
    模板1
    mysql 数据表中查找重复记录
    mysql左连接右连接(查询两张表不同的数据)
    mysql--构造数据、导入导出
    mysql安装
    linux下启动tomcat服务
  • 原文地址:https://www.cnblogs.com/kjitboy/p/5159351.html
Copyright © 2011-2022 走看看