120
public class MyClass {

}

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

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

4

10 回答 10

143

从 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()

于 2014-09-24T13:06:25.887 回答
32

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

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

于 2013-02-27T03:47:42.307 回答
30

听起来您回答了自己的问题。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'
于 2013-02-27T04:11:44.123 回答
14

要获取类名,您可以使用 ReflectionClass

class MyClass {
    public function myNameIs(){
        return (new \ReflectionClass($this))->getShortName();
    }
}
于 2017-10-25T09:38:23.197 回答
13

它看起来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]

于 2019-02-03T11:23:16.067 回答
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" 
于 2013-02-27T04:27:35.440 回答
6

我认为在 PHP 中提及“self”和“static”之间的细微差别很重要,因为“最佳答案”使用“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
于 2017-06-22T09:28:45.707 回答
4

即使使用命名空间,这也会返回纯类名:

echo substr(strrchr(__CLASS__, "\\"), 1);    
于 2019-02-11T11:38:00.723 回答
2

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

Class_Name::class:返回具有命名空间的类。所以之后只需要创建一个数组,然后获取数组的最后一个值。

于 2019-01-08T14:02:19.613 回答
0
<?php
namespace CMS;
class Model {
  const _class = __CLASS__;
}

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

适用于PHP 5.5之前的版本

于 2017-02-16T21:35:24.867 回答