PHP 5.5已经实现了一种新功能,可以通过语法检索类名::class:
<?php
namespace Testing;
class Test{}
echo Test::class; // Testing\Test;
Run Code Online (Sandbox Code Playgroud)
这很好用,好吗?我和其他一些朋友想知道的是为什么这个语法在与未声明的类一起使用时也会返回一个类名.例如:
<?php
echo UndeclaredClass::class; // UndeclaredClass
Run Code Online (Sandbox Code Playgroud)
在其他几种情况下会出现错误,但不会出现此错误.任何人都知道,如果可能的具体基础,为什么会发生这种情况?
它对Late Late Bindings有什么作用,或者它只是这个全新功能的(临时)限制/错误吗?
最后一个正式答案......相对而言.它是由requinix@php.net在我今天创建的一份报告中提交给我的.唯一的例外是这个人如何参与PHP开发.
PHP不需要知道类的定义来获得其完全限定的名称.所有必需的信息都在编译时可用,因此不需要加载它.
类似于使用的命名空间在编译时解析,即在文件执行之前编译时.这就是为什么有严格的要求才能使用它们.
由于所有这些要求,当PHP遇到类名时,它可以立即知道其完全限定名称.作为一个文件系统的它的思考命名空间将是相对位置的目录和使用将是符号链接.
类名是绝对的("\ Testing\Test")或相对的("Test"),如果是相对的,它可以是普通名称.[需要更多背景]
namespace Testing {
echo Test::class; // \Testing + Test = \Testing\Test
}
Run Code Online (Sandbox Code Playgroud)
或别名:
use Testing\Test as AliasedTest;
echo AliasedTest::class; // AliasedTest + use = \Testing\Test
Run Code Online (Sandbox Code Playgroud)
没有所有这些自动加载将无法正常工作!
::class 只是一个公开PHP一直知道的信息的新工具.
这个"扩展答案"与我收到的bug报告几乎相同.这么多明显的复制和粘贴的原因是因为,最初,我为另一个Stack Overflow社区建立了这个答案
| 归档时间: |
|
| 查看次数: |
1038 次 |
| 最近记录: |