回答:
この機能はPHP 5.5で実装されました。
ドキュメント:http : //php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name
これは2つの理由で非常に便利です。
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」と同等ですが、バックスラッシュプレフィックスはありません。