답변:
이 기능은 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"
];
업데이트 :
이 기능은 Late Static Binding 에도 유용합니다 .
__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
에 속하는지 궁금하다면 (언어 구조 등) 매우 간단합니다. 그것은 A의 일정 . 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"와 동일합니다.