public class MyClass {
}
在Java中,我们可以使用String className = MyClass.class.getSimpleName();
如何在PHP中执行此操作?我已经知道get_class()
,但它仅适用于对象。目前我在Active Record工作。我需要像MyClass::className
这样的陈述。
答案 0 :(得分:91)
自PHP 5.5 以来,您可以通过 ClassName :: class 使用类名解析。
<?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()。
答案 1 :(得分:24)
您可以在课程中使用__CLASS__
来获取名称。
答案 2 :(得分:17)
听起来你回答了自己的问题。 get_class
会为您提供班级名称。这是程序性的,也许是造成混乱的原因。看一下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&gt; = 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'
答案 3 :(得分:10)
现在,我已经回答了我的问题。感谢Brad的链接,我找到了答案here。感谢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"
答案 4 :(得分:6)
要获取类名,可以使用ReflectionClass
class MyClass {
public function myNameIs(){
return (new \ReflectionClass($this))->getShortName();
}
}
答案 5 :(得分:3)
我认为提及“自我”和“自我”之间的差别很重要。和静态&#39;用PHP作为最佳答案&#39;使用&#39;静态&#39;这可能会给某些人带来混乱的结果。
<?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
答案 6 :(得分:2)
看来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]
答案 7 :(得分:0)
<?php
namespace CMS;
class Model {
const _class = __CLASS__;
}
echo Model::_class; // will return 'CMS\Model'
早于 PHP 5.5
答案 8 :(得分:0)
end(preg_split("#(\\\\|\\/)#", Class_Name::class))
Class_Name::class
:返回带有名称空间的类。因此,在只需要创建一个数组之后,就可以获取该数组的最后一个值。
答案 9 :(得分:0)
echo substr(strrchr(__CLASS__, "\\"), 1);