"类名解析"实际上是什么意思?
这段代码展示了如何使用php提供的特殊类(class)来获取完全合格的类名。在代码中,定义了一个名为foo的类,并在其中定义了一个名为test的常量,其值为'foobar!'。然后通过echo foo::test来打印出常量的值,即'foobar!'。此外,文章中还提到了Laravel为什么决定转而使用这种方式。
Laravel决定使用这种方式的原因是它可以减少出现拼写错误的可能性。通过使用类名解析,可以使用字符串'\App\Console\Commands\Inspire'或Inspire::class来获取相同的结果,但是使用后者可以在IDE中捕获语法或拼写错误,从而更容易进行调试。
这段代码和问题之间的关系是,代码演示了如何使用php提供的类名解析功能来获取完全合格的类名,而问题则是询问了类名解析的实际含义。
"类名解析"实际上是什么意思?
在PHP 5.5中,SomeClass::class
将返回SomeClass
的完全限定名称,包括命名空间。这个特性非常有用,有两个原因。
首先,你不再需要将类名存储在字符串中。因此,当你重构代码时,许多集成开发环境(IDE)可以检索这些类名。
其次,你可以使用use
关键字来解析你的类,而不需要编写完整的类名。
例如:
use \App\Console\Commands\Inspire; //... protected $commands = [ Inspire::class, // 等同于 "App\Console\Commands\Inspire" ];
更新:
这个特性对于"后期静态绑定"也非常有用。
你可以使用static::class
特性,在父类中获取派生类的名称,而不是使用__CLASS__
魔术常量。例如:
class A { public function getClassName(){ return __CLASS__; } public function getRealClassName() { return static::class; } } class B extends A {} $a = new A; $b = new B; echo $a->getClassName(); // A echo $a->getRealClassName(); // A echo $b->getClassName(); // A echo $b->getRealClassName(); // B
注意:在第一个示例中,Inspire::class
等同于"App\Console\Commands\Inspire",没有反斜杠前缀。
注意:两种表示法use \App\...
和use App\...
都是允许的。我使用它来区分一个包含在子命名空间中的类和一个包含在当前命名空间层次结构之外的类。
需要注意的是,你可以输入任何内容,仍然会得到一个"类"名称。如果集成开发环境(IDE)没有捕捉到,我可以输入SomeDumbCrapThatDoesntExist::class,它不会给我报错或警告。很容易打字错误而忽略它。