命名空间的 PHP use 语句

标签 php php-internals

也许这是个奇怪的问题,但我无法弄清楚当您编写时 php 内部会发生什么:

use garcha\path\class;

我不是在问命名空间的用途,而是在问该语句本身,即使它不分配任何内存,我的意思是,当您甚至为某个类提供别名时:

use garcha\path\class as withNewName;

它存储在哪里?或者它是如何记住名字的?它只发生在编译时吗?而不是运行时间?就像只是描述功能。

最佳答案

这不是一个非常复杂的算法(对于 5.5,在 5.6 中描述的类名部分是相同的)。

  1. 如果有必要,创建哈希表的实例。它保留导入(使用的命名空间类)。
  2. 在使用 as 关键字的情况下,此名称用作别名。否则使用导入类名称的最后一个组件(对于 XXX\YYY\ZZZ,名称将是 ZZZ)。将其转换为小写。
  3. 检查self/parent,它不能用作别名。
  4. 检查此名称是否已存在于 class_table 中(如果已声明,则使用当前命名空间)。
  5. 将此别名添加到特殊的 HashTable(在 p.1 中提到)。

这张 table 用在什么地方?

就在解析类名的编译过程中。

关于别名还有一件更有趣的事情——它的作用域是命名空间 block :

<?php

namespace nsC
{
    class classC {}
}

namespace nsA
{
    use nsC\classC as importC;
    new importC();
}

namespace nsB
{
    // ERROR!
    new importC(); // or \nsA\importC()
}

关于命名空间的 PHP use 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25673824/

相关文章:

php - MySql,将数据从另一个表行插入到一个表行(该行刚刚创建)

php - 从数据库中搜索字符串并获取接近单词的 php

php - 转换为字符串时 (string)$value 和 "$value"之间哪个更快

php - 括号改变函数调用结果的语义

php - PHP 如何为变量分配和释放内存?

php - 如何通过 MySQL 查询使用 BirthDate 列获取年龄?

php - 在 CSS 中选择具有相同父项的多个子项

php - PHP 中 strlen() 函数的源代码在哪里?

php - 据说不是 "binary safe"的 PHP 函数是什么?这些 "non-binary safe"函数将字符串传递给哪些库?为什么?

php - imagejpeg() 无法打开进行写入 - 有时有效,有时无效