Answers:
此功能已在PHP 5.5中实现。
文档:http : //php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name
有两个原因,它非常有用。
use
关键字来解析您的班级,而无需编写完整的班级名称。举个例子 :
use \App\Console\Commands\Inspire;
//...
protected $commands = [
Inspire::class, // Equivalent to "App\Console\Commands\Inspire"
];
更新:
此功能对于后期静态绑定也很有用。
__CLASS__
您可以使用static::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
use \App\...
和use App\...
允许。我用它来使包含在子命名空间中的类和包含在当前命名空间层次结构之外的类之间的区别。
class
是特殊的,由php提供,以获取完全限定的类名。
参见http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name。
<?php
class foo {
const test = 'foobar!';
}
echo foo::test; // print foobar!
如果您对::class
属于哪个类别(无论是语言构造等)感到好奇,那么它非常简单。这是一个常数。PHP将其称为“特殊常量”。这很特别,因为它是由PHP提供的。
请注意使用以下内容:
if ($whatever instanceof static::class) {...}
这将引发语法错误:
unexpected 'class' (T_CLASS), expecting variable (T_VARIABLE) or '$'
但是您可以改为执行以下操作:
if ($whatever instanceof static) {...}
要么
$class = static::class;
if ($whatever instanceof $class) {...}
$className = 'SomeCLass'; $className = new $className(); $methodName = 'someMethod'; $className->$methodName($arg1, $arg2, $arg3); /* or if args can be random array*/ call_user_func_array([$className, $methodName], $arg);
Inspire::class
等效于“ App \ Console \ Commands \ Inspire”,但没有反斜杠前缀。