public class MyClass {
}
Java에서는 다음과 같이 클래스 이름을 얻을 수 있습니다. String className = MyClass.class.getSimpleName();
PHP에서 어떻게할까요? 나는 이미 알고 get_class()
있지만 객체에 대해서만 작동합니다. 현재 저는 Active Record에서 일하고 있습니다. 나는 같은 진술이 필요합니다 MyClass::className
.
public class MyClass {
}
Java에서는 다음과 같이 클래스 이름을 얻을 수 있습니다. String className = MyClass.class.getSimpleName();
PHP에서 어떻게할까요? 나는 이미 알고 get_class()
있지만 객체에 대해서만 작동합니다. 현재 저는 Active Record에서 일하고 있습니다. 나는 같은 진술이 필요합니다 MyClass::className
.
public $__CLASS__ = __CLASS__;
... 다른 모든 클래스와 함께 춤을
답변:
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 ()를 사용할 수 있습니다 .
static::class
과 의 차이점은 무엇입니까 get_class_name()
?
static::class
동안 컴파일 시간 동안 해결되는 것처럼 보입니다 get_class_name()
. 동적으로 생성 된 클래스의 :: class property (?)에 액세스하려고 시도하고 다음 오류가 발생하여이를 발견 Dynamic class names are not allowed in compile-time ::class fetch
했습니다.. 자세한 내용은이 답변 을 참조하십시오. 또한 문서 에서이 메모 가 유용 하다는 것을 알았습니다 .
__CLASS__
클래스 내에서 사용 하여 이름을 얻을 수 있습니다 .
get_class($this)
, static::class
)은 단순히 자식 (부모를 확장하는) 클래스 이름을 반환합니다.
self::class
, 또한 부모 클래스 이름을 반환하는 것 같습니다.
질문에 답하신 것 같습니다. 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"
FooBar::getClassName()
항상 'FooBar'
입니다. 입력 할 수 있으면 대신 Product::getClassName()
입력 할 수도 'Product'
있습니다.
클래스 이름을 얻으려면 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