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

public class MyClass {

}

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

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



답변

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 ()를 사용할 수 있습니다 .


답변

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

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


답변

질문에 답하신 것 같습니다. 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'


답변

이제 내 문제에 대한 답이 있습니다. 링크에 대한 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" 


답변

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

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


답변

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]


답변

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