【问题标题】:Reflection in namespace php命名空间php中的反射
【发布时间】:2012-08-05 06:50:24
【问题描述】:
namespace foo;
class a
{
private $bar;
public $baz;
protected $alpha
}

$reflect=new \ReflectionClass('a');
$properties=$reflect->getProperties(ReflectionProperty::IS_PROTECTED);

它将返回ReflectionProperty 找不到类致命错误其中$properties 是ReflectionProperty 的对象数组。为什么它不自动解析到全局空间?其中与 DOM 相关的类是隐式执行的。如果 ReflectionProperty 类在命名空间中是 used ,则它可以工作。但为什么不隐含地发生呢?

【问题讨论】:

  • 请修复您的代码的其他问题,以便我们可以看到“ReflectionProperty class not found Fatal error”;如果可以的话。
  • @salthe 我不确定你指的是什么问题。
  • 我不明白为什么我的问题被否决了。我的问题有什么问题?
  • 复制并粘贴上面的代码(应该显示所描述的行为)会导致Parse Error。修复此解析错误会导致 ReflectionException 声明 Class a does not exist。修复此异常会导致 Fatal error: Class 'foo\ReflectionProperty' not found。最后一个错误与您描述的问题最相似,但是类名不同(我的有命名空间,您的描述没有)。所有这些都是我们不应该做的工作,来帮助你。

标签: php reflection namespaces


【解决方案1】:

相对类名(不以\\ 开头的类名)总是首先针对当前命名空间解析,然后针对每个别名标识符(通过use)解析。这尤其意味着,如果您自己没有定义具体的命名空间,那么您就是在全局命名空间中,这意味着 \BarBar 引用同一个类。但是,如果您在命名空间 Foo 中,它们会有所不同 (\Bar <==> Bar == \Foo\Bar)。

您可以找到detailed explanation in the manual。在手册的"namespace basics" section 中,您可以找到这背后的想法:它就像一个文件系统。如果您在根目录下,cat /etc/passwdcat etc/passwd 是相同的,但如果您更改工作目录,则不是。

(旁边:应该是$reflect=new \ReflectionClass('\\foo\\a');,或者$reflect=new \ReflectionClass(__NAMESPACE__ . '\\a');

【讨论】:

    【解决方案2】:

    命名空间中的类将在命名空间名称之前,全局属性需要在斜线(\)之前。 use manual 试试这个

    namespace foo;
    class a
    {
    private $bar;
    public $baz;
    protected $alpha;
    }
    
    $reflect=new \ReflectionClass('\\foo\\a');
    $properties=$reflect->getProperties(\ReflectionProperty::IS_PROTECTED);
    

    【讨论】:

    • 我们可以为每个项目声明一个namespace 吗?我的意思是项目中的所有文件都将具有相同的namespace...
    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多