PHP 5.5 Classname解析

时间:2014-06-27 23:01:34

标签: php class php-5.5

PHP 5.5已经实现了一种新功能,可以通过语法::class检索类名:

<?php

namespace Testing;

class Test{}

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

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

<?php

echo UndeclaredClass::class; // UndeclaredClass

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

它对Late Late Bindings有什么影响,或者它只是这个全新功能的(临时)限制/错误吗?

2 个答案:

答案 0 :(得分:5)

最后一个正式答案......相对而言。它是由今天创建的bu report i中由 requinix@php.net 标识的人呈现给我的。唯一的例外是这个人如何参与PHP开发。

TL; DR

  

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

导演剪辑

使用这样的 命名空间在编译时解析,即在编译>之前执行。这就是为什么有严格要求才能使用它们的原因。

由于所有这些要求,当PHP遇到类名时,它可以立即知道其完全限定名称。将其视为文件系统名称空间将是相对位置的目录,而使用将是符号链接

类名是绝对的(&#34; \ Testing \ Test&#34;)或相对的(&#34; Test&#34;),如果是相对的,则可以是普通名称。 [需要更多背景]

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

别名

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

如果没有所有自动加载将不起作用!

::class只是一个揭示PHP一直知道的信息的新工具。

  

这个&#34;扩展答案&#34;与我收到的bug报告几乎相同。这么多明显副本的原因和粘贴是因为,最初,我为另一个Stack Overflow社区建立了这个答案

答案 1 :(得分: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;
?>