当前位置: 首页 > 编程笔记 >

是否有可能在PHP中获得已定义名称空间的列表

宦博超
2023-03-14
本文向大家介绍是否有可能在PHP中获得已定义名称空间的列表,包括了是否有可能在PHP中获得已定义名称空间的列表的使用技巧和注意事项,需要的朋友参考一下

给定文件1具有命名空间ns_1,文件2具有命名空间ns_2,如果文件1和文件2包含在文件3中,则无法知道命名空间ns_1和ns_2已被加载。

唯一的方法是使用'class_exists'函数,可以使用'get_declared_classes'获取具有特定命名空间的类列表。简而言之,给定所有已声明的类名,获得的数据可用于查找匹配的命名空间-

function namespaceExists($namespace) {
   $namespace .= "\\";
   foreach(get_declared_classes() as $name)
   if(strpos($name, $namespace) === 0) return true;
   return false;
}

-  - 要么 - -

示例

<?php
namespace FirstNamespace;
class new_class {}
namespace SecondNamespace;
class new_class {}
namespace ThirdNamespace\FirstSubNamespace;
class new_class {}
namespace ThirdNamespace\SecondSubNamespace;
class new_class {}
namespace SecondNamespace\FirstSubNamespace;
class new_class {}
$namespaces=array();
foreach(get_declared_classes() as $name) {
   if(preg_match_all("@[^\\\]+(?=\\\)@iU", $name, $matches)) {
      $matches = $matches[0];
      $parent =&$namespaces;
      while(count($matches)) {
         $match = array_shift($matches);
         if(!isset($parent[$match]) && count($matches))
         $parent[$match] = array();
         $parent =&$parent[$match];
      }
   }
}
print_r($namespaces);

输出结果

这将产生以下输出-

Array ( [FirstNamespace] => [SecondNamespace] => Array ( [FirstSubNamespace] => ) [ThirdNamespace] => Array ( [FirstSubNamespace] => [SecondSubNamespace] => ) )

创建了不同的命名空间(FirstNamespace,SecondNamespace ..),并声明了空类(new_class)。创建一个命名空间数组,并在声明的类中运行一个foreach循环。正则表达式匹配完成,并且将显示在该特定环境中定义的命名空间。

 类似资料:
  • 声明以下命名空间时: 我得到了这个错误: 所以我想知道PHP中的命名空间是否可以以数字开头?

  • Nrwl说在这里问。看来我是第一个! 我搞错了。我用nx原理图创建了一个名为Angular的项目。如果可能,我想重命名名称空间,以便访问我的库,如: 而不是: 我尝试在angular-cli.json和package.json中更改项目名称,但我非常确定这不是答案。 此外,nx将不能作为标记使用,因为它已经在其他地方使用。我建议使用nrwl nx。 编辑:划掉那个。我没有足够的声誉来创建新标签。如

  • 问题内容: 想知道是否有人在使用新功能通过PHP 5.3对类进行命名空间时是否遇到了此问题。 我正在使用单独的类来生成动态类调用,以在应用程序中定义用户类型。基本上,类定义器采用类型的整数表示形式并解释它们,返回一个包含要用作该用户模型的类名的字符串。 我在全局范围内定义了具有该名称的用户类型的对象模型,但是在Editor名称空间中,该用户的编辑器具有另一个名称相同的对象。由于某些原因,PHP不允

  • 有什么方法可以获得套接字上注册的所有命名空间的列表吗? 例如,假设某个客户机连接到一个命名空间:`socket=io('/some-nsp'); 它们现在自动地位于名称空间中,因为socket.io并不阻止创建随机名称空间。 如果我想查看所有现有命名空间的列表并断开这些用户的连接,我如何获得这样的列表。 我尝试过,但这只是一个循环的垃圾列表。 是否有一种“正式”的方法来获取套接字上注册的所有名称空

  • 问题内容: 因此,我拥有这个现有的数据库架构,其中包含许多要使用JPA / Hibernate建模的表。每个表具有同一组,每组包含30个其他列(以允许运行时扩展记录的字段数)。 我计划为每个表定义简单的类 然后在公共类中定义公共附加参数 尽管这行得通,但我不喜欢此类的硬编码性质。 我想将每组字符串,长字段和双精度字段建模为一个附加参数组,然后将其设置为0..9组。如果需要的话,这样我以后可以轻松添

  • 我还尝试使用了optional(),但唯一的区别是regex包含了一个‘?’在最后。JSON断言仍然失败。 在存根中,两个结果都返回,但对于测试,我希望测试也能成功。测试断言纯粹是在每个属性的最后一次出现时生成的吗?难道没有可能在数组上使用类似'optional()'的东西吗?