【问题标题】:PHP 5.5 Classname ResolutionPHP 5.5 类名解析
【发布时间】:2014-08-19 03:49:55
【问题描述】:

PHP 5.5 已作为一项新功能实现了一种通过语法::class 检索类名的新方法:

<?php

namespace Testing;

class Test{}

echo Test::class; // Testing\Test;

这很完美,好吗?但是我和其他一些朋友想知道的是,为什么这种语法在与未声明的类一起使用时也会返回类名。例如:

<?php

echo UndeclaredClass::class; // UndeclaredClass

在其他几种情况下会引发错误,但这里不会。任何人都知道,如果可能的话,有具体的依据,为什么会发生这种情况?

它对后期静态绑定有什么影响,还是只是这个全新功能的(临时)限制/错误?

【问题讨论】:

  • 有趣的问题。为什么不在 PHP 开发者邮件列表中询问(或参考此页面)?
  • 如果我说我说我不知道​​你会相信我吗?
  • 嗯,是的,因为我知道它有多复杂:bg2.php.net/contact.phpbg2.php.net/support.php 您最好快速的选择是邮件列表,因为没有官方 IRC 频道。之后请在这里分享答案。
  • 这对我来说是不可重现的,&lt;?php echo UndeclaredClass::class; 总是为我抛出一个错误。

标签: php class php-5.5


【解决方案1】:

终于有官方答案了……相对来说。它是由 requinix@php.net 在我今天创建的 bu report 中确定的人向我介绍的。唯一的例外是这个人对 PHP 开发的参与程度。

TL;DR

PHP 不需要知道类的定义来获得它的完全限定名称。所有必需的信息都在编译时可用,因此无需加载。

导演剪辑版

命名空间uses 一样在编译时解析,即在文件被编译时执行之前。这就是为什么要使用它们有严格的要求。

由于所有这些要求,当 PHP 遇到类名时,它可以立即知道其完全限定名。将其视为文件系统,namespace 将是相对位置的目录,而 use 将是 symlinks

类名可以是绝对的(“\Testing\Test”)或相对的(“Test”),如果是相对的,它可以是普通名称。 [需要更多上下文]

namespace Testing {
    echo Test::class; // \Testing + Test = \Testing\Test
}

或者一个别名

use Testing\Test as AliasedTest;
echo AliasedTest::class; // AliasedTest + use = \Testing\Test

没有所有这些自动加载将无法正常工作!

::class 只是一个新工具,用于公开 PHP 一直知道的信息。

这个“扩展答案”与我收到的错误报告几乎相同。如此明显的复制和粘贴的原因是,最初,我为另一个 Stack Overflow 社区建立了这个答案

【讨论】:

  • 您能解释一下为什么echo UndeclaredClass::class; 不会为您抛出错误吗?
  • 回答我的支持票的人解释说,类名是在实例化对象本身之前获得的,因此不会引发错误,因为不需要加载类。
  • 这实际上非常有用 - 它允许 IDE 在设计时捕获拼写错误,而不会在运行时产生潜在的开销(想想使用 IOC 容器进行延迟注册)。感谢您获得官方声明
【解决方案2】:

您可以使用get_class 函数获取带有命名空间的类名。使用它会很好。 这是您可以尝试此代码的代码:

<?php
namespace Testing;

class Test{
    public function abc()
    {
        echo "This is the ABC.";
    }
}

namespace Testing1;

class Test{
    public function abc()
    {
        echo "This is the ABC.";
    }
}
// echo Test::class; // Testing\Test;
$test =  new Test();

print_r(get_class($test));
// echo "<br>";
// echo UndeclaredClass::class;
?>

【讨论】:

  • 虽然我很欣赏你的回答,但这不是问题的重点。我没有尝试检索类名。相反,我试图理解为什么这样的功能没有引发错误。
猜你喜欢
  • 2011-11-24
  • 2019-01-24
  • 2016-06-24
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多