如何获取PHP中的类名?


99
public class MyClass {

}

在Java中,我们可以使用 String className = MyClass.class.getSimpleName();

如何在PHP中做到这一点?我已经知道了get_class(),但是它仅适用于对象。目前,我在Active Record工作。我需要像这样的声明MyClass::className


1
当它可能对php有帮助时,您能举一个特定的例子吗?如果您已经对类名进行了硬编码,则可以将其用引号引起来并获得所需的内容。
zerkms

2
不幸的是,像RenameClass这样的自动重构(例如,在IDE中)通常不会重命名此类名称字符串。因此,除了public $__CLASS__ = __CLASS__;与其他所有班级进行舞蹈之外,最好采用某种静态方式来获得班级名称...
EricSchaefer 2014年

Answers:


114

从PHP 5.5开始,您可以通过ClassName :: class使用类名解析。

查看PHP5.5的新功能

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::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()
亚历山大·扬克

1
@AlexanderJank似乎static::class在编译时已解决,而get_class_name()在运行时已解释。通过尝试访问动态生成的类的:: class property(?)并收到以下错误,我发现了这一点Dynamic class names are not allowed in compile-time ::class fetch。有关更多详细信息,请参见此答案。我还从文档中发现此说明很有帮助。
cjsimon

29

您可以__CLASS__在一个类中使用以获取名称。

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


3
您还可以在这里查看所有有趣的const:php.net/manual/en/language.constants.predefined.php
MatRt 2013年

感谢@Brad提供的链接,我在这里
Rezan Achmad13年

2
@ user1073122,这是我在答案中链接的链接。
Brad 2013年

就像我试图在父类中定义的方法中获取类名一样,该值是+1。其他解决方案(get_class($this)static::class)仅返回子类(扩展了父类)的类名。
akinuri

继续self::class,也似乎返回父类名称。
akinuri

22

听起来您已经回答了自己的问题。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 Late 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

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

7
是的,我知道..我想避免输入错误,并且在重构类名(使用IDE工具)时,也不需要搜索和替换字符串。
Rezan Achmad

如果您需要在父“模型”类中使用子类的类名,这也可能会有所帮助。
JR Lawhorne

8

要获取类名,可以使用ReflectionClass

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

尽管此代码段可能是解决方案,但包括说明确实有助于提高帖子的质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
yivi

绝对特别!!!这是一个超级但简单的解决方案!谢谢!!!
西蒙妮·坎帕尼亚

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中“自我”和“静态”之间的微小差异,因为“最佳答案”使用“静态”会使某些人感到困惑。

<?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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.