PHP에서 클래스 이름을 어떻게 얻습니까?


100
public class MyClass {

}

Java에서는 다음과 같이 클래스 이름을 얻을 수 있습니다. String className = MyClass.class.getSimpleName();

PHP에서 어떻게할까요? 나는 이미 알고 get_class()있지만 객체에 대해서만 작동합니다. 현재 저는 Active Record에서 일하고 있습니다. 나는 같은 진술이 필요합니다 MyClass::className.


1
PHP에서 도움이 될 수있는 특정 예를 들어 주시겠습니까? 클래스 이름을 하드 코딩 한 경우 따옴표로 묶어 원하는 것을 얻을 수 있습니다.
zerkms 2013

2
불행히도 RenameClass와 같은 자동 리팩토링 (예 : IDE)은 일반적으로 이러한 클래스 이름 문자열의 이름을 바꾸지 않습니다. 따라서이 일을 제외하고, 클래스 이름을 얻을 수있는 정적 방법의 일종 가지고 좋은 것입니다 public $__CLASS__ = __CLASS__;... 다른 모든 클래스와 함께 춤을
EricSchaefer

답변:


115

PHP 5.5부터 ClassName :: class 를 통해 클래스 이름 확인을 사용할 수 있습니다 .

PHP5.5의 새로운 기능을 참조하십시오 .

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

클래스 메서드에서이 기능을 사용하려면 static :: class 사용하십시오 .

<?php

namespace Name\Space;

class ClassName {
   /**
    * @return string
    */
   public function getNameOfClass()
   {
      return static::class;
   }
}

$obj = new ClassName();
echo $obj->getNameOfClass();

?>

이전 버전의 PHP의 경우 get_class ()를 사용할 수 있습니다 .


5
static::class과 의 차이점은 무엇입니까 get_class_name()?
Alexander Jank

1
@AlexanderJank 런타임 중에 해석되는 static::class동안 컴파일 시간 동안 해결되는 것처럼 보입니다 get_class_name(). 동적으로 생성 된 클래스의 :: class property (?)에 액세스하려고 시도하고 다음 오류가 발생하여이를 발견 Dynamic class names are not allowed in compile-time ::class fetch했습니다.. 자세한 내용은이 답변 을 참조하십시오. 또한 문서 에서이 메모 가 유용 하다는 것을 알았습니다 .
cjsimon 2019 년

29

__CLASS__클래스 내에서 사용 하여 이름을 얻을 수 있습니다 .

http://php.net/manual/en/language.constants.predefined.php


3
여기에서 흥미로운 모든 const를 볼 수도 있습니다. php.net/manual/en/language.constants.predefined.php
MatRt

링크에 대한 @ 브래드 덕분에, 나는 답을 찾을 여기
Rezan Achmad

2
@ user1073122, 그것은 내 대답에서 링크 한 링크입니다.
Brad

+1 부모 클래스에 정의 된 메서드에서 클래스 이름을 얻으려고 할 때. 다른 솔루션 ( get_class($this), static::class)은 단순히 자식 (부모를 확장하는) 클래스 이름을 반환합니다.
akinuri

계속 : self::class, 또한 부모 클래스 이름을 반환하는 것 같습니다.
akinuri

23

질문에 답하신 것 같습니다. get_class수업 이름을 알려줍니다. 절차 적이며 혼란을 일으키는 원인 일 수 있습니다. 에 대한 PHP 문서를 살펴보십시오.get_class

다음은 그들의 예입니다.

 <?php

 class foo 
 {
     function name()
     {
         echo "My name is " , get_class($this) , "\n";
     }
 }

 // create an object
 $bar = new foo();

 // external call
 echo "Its name is " , get_class($bar) , "\n"; // It's name is foo

 // internal call
 $bar->name(); // My name is foo

예제와 비슷하게 만들려면 다음과 같이 할 수 있습니다.

 <?php

 class MyClass
 {
       public static function getClass()
       {
            return get_class();
       }
 }

이제 다음을 수행 할 수 있습니다.

 $className = MyClass::getClass();

그러나 내 클래스가 확장되면 여전히 'MyClass'를 반환하기 때문에 이것은 다소 제한적입니다. get_called_class대신 상대적으로 새로운 기능인 Late Static Binding 에 의존 하고 PHP> = 5.3이 필요한 대신 사용할 수 있습니다 .

<?php

class MyClass
{
    public static function getClass()
    {
        return get_called_class();
    }

    public static function getDefiningClass()
    {
        return get_class();
    }
}

class MyExtendedClass extends MyClass {}

$className = MyClass::getClass(); // 'MyClass'
$className = MyExtendedClass::getClass(); // 'MyExtendedClass'
$className = MyExtendedClass::getDefiningClass(); // 'MyClass'

아이디어에 대해 @ J.Money에게 감사드립니다. 그러나 상속에서는 작동하지 않습니다.
Rezan Achmad 2013

11

이제 내 문제에 대한 답이 있습니다. 링크에 대한 Brad 덕분에 여기 에서 답을 찾을 수 있습니다 . 그리고 아이디어에 대해 J. Money 에게 감사드립니다 . 내 솔루션 :

<?php

class Model
{
    public static function getClassName() {
        return get_called_class();
    }
}

class Product extends Model {}

class User extends Model {}

echo Product::getClassName(); // "Product" 
echo User::getClassName(); // "User" 

3
그것은 말도 안돼. FooBar::getClassName()항상 'FooBar'입니다. 입력 할 수 있으면 대신 Product::getClassName()입력 할 수도 'Product'있습니다.
zerkms 2013

7
예, 알아요 .. 오타를 피하고 싶습니다. 또한 IDE 도구를 사용하여 클래스 이름을 리팩토링 할 때 문자열을 검색하고 바꿀 필요가 없습니다.
Rezan Achmad 2013

부모 "Model"클래스에서 자식 클래스의 클래스 이름을 사용해야하는 경우에도 도움이 될 수 있습니다.
JR Lawhorne

9

클래스 이름을 얻으려면 ReflectionClass를 사용할 수 있습니다.

class MyClass {
    public function myNameIs(){
        return (new \ReflectionClass($this))->getShortName();
    }
}

이 코드 조각이 해결책이 될 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 도움이됩니다. 미래에 독자를 위해 질문에 답하고 있으며 해당 사용자는 코드 제안 이유를 모를 수 있습니다.
yivi

절대적으로 특별합니다 !!! 이것은 훌륭하지만 간단한 솔루션입니다! 감사합니다 !!!!
Simone Campagna

4

ReflectionClass꽤 생산적인 옵션 인 것 같습니다 .

class MyClass {
    public function test() {
        // 'MyClass'
        return (new \ReflectionClass($this))->getShortName();
    }
}

기준:

Method Name      Iterations    Average Time      Ops/second
--------------  ------------  --------------    -------------
testExplode   : [10,000    ] [0.0000020221710] [494,518.01547]
testSubstring : [10,000    ] [0.0000017177343] [582,162.19968]
testReflection: [10,000    ] [0.0000015984058] [625,623.34059]

3

PHP에서 'self'와 'static'의 차이를 거의 언급하지 않는 것이 중요하다고 생각합니다.

<?php
class X {
    function getStatic() {
        // gets THIS class of instance of object
        // that extends class in which is definied function
        return static::class;
    }
    function getSelf() {
        // gets THIS class of class in which function is declared
        return self::class;
    }
}

class Y extends X {
}
class Z extends Y {
}

$x = new X();
$y = new Y();
$z = new Z();

echo 'X:' . $x->getStatic() . ', ' . $x->getSelf() . 
    ', Y: ' . $y->getStatic() . ', ' . $y->getSelf() . 
    ', Z: ' . $z->getStatic() . ', ' . $z->getSelf();

결과 :

X: X, X
Y: Y, X
Z: Z, X

2

end(preg_split("#(\\\\|\\/)#", Class_Name::class))

Class_Name::class: 네임 스페이스가있는 클래스를 반환합니다. 따라서 배열을 생성하기 만하면 배열의 마지막 값을 가져옵니다.


0
<?php
namespace CMS;
class Model {
  const _class = __CLASS__;
}

echo Model::_class; // will return 'CMS\Model'

PHP 5.5 이전


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.