PHP에서 :: class는 무엇입니까?


102

::classPHP 의 표기법 은 무엇입니까 ?

빠른 Google 검색은 구문의 특성 때문에 아무것도 반환하지 않습니다.

콜론 콜론 클래스

이 표기법을 사용하면 어떤 이점이 있습니까?

protected $commands = [
    \App\Console\Commands\Inspire::class,
];

답변:


87

이 기능은 PHP 5.5에서 구현되었습니다.

문서 : http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

두 가지 이유로 매우 유용합니다.

  • 더 이상 문자열에 클래스 이름을 저장할 필요가 없습니다. 따라서 코드를 리팩터링 할 때 많은 IDE에서 이러한 클래스 이름을 검색 할 수 있습니다.
  • 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

1
약간의 수정 사항 : 첫 번째 예 Inspire::class에서 백 슬래시 접두사가없는 "App \ Console \ Commands \ Inspire"와 동일합니다.
제이슨

1
@FabienHaddadi : 두 표기법 점에 유의 use \App\...하고이 use App\...허용됩니다. 이를 사용하여 하위 네임 스페이스에 포함 된 클래스와 현재 네임 스페이스 계층 구조 외부에 포함 된 클래스를 구분합니다.
alphayax

경고의 한마디, 당신은 무엇이든 입력하고 여전히 "클래스"이름을 얻을 수 있습니다. SomeDumbCrapThatDoesntExist :: class를 입력 할 수 있으며 IDE가 감지하지 못하는 경우 오류나 경고를 표시하지 않습니다. 오타를 만들고 놓치기 쉽습니다.
Gabriel Alack

19

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!

Laravel이 전환하기로 결정한 이유가 있습니까?
야다

7
Inspire 클래스에서는 상수가 아닙니다. PHP에서 제공하는 상수입니다. 정규화 된 클래스 이름을 얻는 빠른 방법입니다. php.net/manual/en/…
jfadich 2015-06-11

1
@Yada 나는 그것을 사용하는 Laravel의 이유는 그것이 당신에게 오타를 만들 수있는 곳을 하나 덜 제공한다는 것입니다. 문자열 '\ App \ Console \ Commands \ Inspire'또는 Inspire :: class를 사용하여 동일한 결과를 얻을 수 있지만 IDE는 후자에서 구문 / 맞춤법 오류를 포착하여 디버그하기가 조금 더 쉽습니다.
jfadich 2015-06-11


0

다음을 사용하십시오.

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) {...}

동적 이름 지정을위한이 해킹은 PHP 5. *에서 다음과 같이 작동합니다.$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);
Vladimir Ch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.