【问题标题】:How to get property class namespace in php 5.6 via reflection如何通过反射在 php 5.6 中获取属性类命名空间
【发布时间】:2017-04-06 14:26:08
【问题描述】:

我想通过ReflectionClass获取一个类属性的命名空间。

namespace Foo\Bar;
use Foo\Quux\B;

class A{

   /**
   * @var B $b
   */
   protected $b = null;

   ...

}

在另一个类中,我正在创建一个 ReflectionClass 对象并尝试获取属性 b 的命名空间,以便我可以为它的类创建 ReflectionClass

$namespace = "Foo\\Bar";
$classname = "A";
$rc = new \ReflectionClass("$namespace\\$classname");
$type = getVarType($rc->getProperty("b")->getDocComment()); // returns B
$ns = $rc->getProperty("b")-> ... // I want to find out the namespace of class B
$rc1 = new \ReflectionClass("$ns\\$type");

是否有可能找出类 A 使用了哪些命名空间? 然后我可以将class A 使用的命名空间与发现的属性类型配对。

我知道我可以用这样的类型提示来解决这个问题:@var Foo\Quux\B $b,但是我有很多像 class A 这样的类,有很多属性和方法使用像 b 这样的类型,我不想重构整个代码。

是否可以从use 语句中找到命名空间,或者我必须使用显式类型提示?

谢谢!

【问题讨论】:

    标签: php reflection namespaces php-5.6


    【解决方案1】:

    您应该可以使用 getNamespaceName 找出答案,但 getProperty 也可以告诉您

    namespace Foo;
    
    class A {
        protected $something;
    }
    
    namespace Bar;
    
    class B {
        protected $a;
    
        public function __construct(){
            $this->a = new \Foo\A();
        }
    }
    
    $reflection = new \ReflectionClass('Bar\\B');
    $a = $reflection->getProperty("a");
    var_dump($a);
    

    你会得到

    object(ReflectionProperty)#2 (2) {
    ["name"]=> 字符串(1) "a"
    ["class"]=> 字符串(5) "Bar\B"
    }

    【讨论】:

    • 谢谢你的回答,但这不是我想要的结果。我希望返回的类是Foo\A,所以我可以递归地查看它,即。创建new \ReflectionClass("Foo\\A");
    • 所以在返回的类上做一个str_replace,你就可以完全按照你的描述去做
    • 问题是,我真的不知道首先要期待哪个类或命名空间。您的代码示例中的类B 也可能有一个属性$c,例如应该是Foobar\CBar\C。我真的不知道 php 是否能够发现真正的类,除非查看将写入完整命名空间的 DocComment。
    • @PavelKocábek 类B 的属性不应基于B,除非它们属于从B 扩展的类。这个答案是正确的
    【解决方案2】:

    一种解决方案是找到声明文档注释中使用的类的 use 语句。这样就可以从类名中检索完整的命名空间。

    您不能直接使用 ReflectionClass 来做到这一点,但 this post 可能会很有趣,或者您可以使用 BetterReflection

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 2019-07-03
      • 2010-11-15
      • 1970-01-01
      • 2012-08-05
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多