9

PHP 5.5 作为一个新特性实现了一种通过语法检索类名的新方法::class

<?php

namespace Testing;

class Test{}

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

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

<?php

echo UndeclaredClass::class; // UndeclaredClass

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

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

4

2 回答 2

5

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

TL;博士

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

导演剪辑版

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

由于所有这些要求,当 PHP 遇到一个类名时,它可以立即知道它的完全限定名。将其视为文件系统,名称空间将是相对位置的目录,而使用将是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 社区建立了这个答案

于 2014-06-30T19:03:49.040 回答
0

您可以使用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;
?>
于 2014-07-30T15:48:08.677 回答