How do I get class name in PHP?

public class MyClass {


}

In Java, we can get class name with String className = MyClass.class.getSimpleName();

How to do this in PHP? I already know get_class(), but it works only for objects. Currently I work in Active Record. I need statement like MyClass::className.

197078 次浏览

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

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

听起来你已经回答了自己的问题。get_class会给你类名。这是程序性的,也许这就是造成混乱的原因。查看 get_class的 php 文档

下面是他们的例子:

 <?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,它依赖于相对较新的特性 后期静态绑定,并且需要 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的创意。我的解决办法是:

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

由于 PHP 5.5 ,您可以通过 类名: : 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 ()

<?php
namespace CMS;
class Model {
const _class = __CLASS__;
}


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

超过 PHP 5.5

我认为在 PHP 中提到“ self”和“ static”之间的区别很重要,因为“ best answer”使用了“ 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

要获取类名,可以使用 RefectionClass

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

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

返回带有命名空间的类。因此,在您只需要创建一个数组之后,就可以得到该数组的最后一个值。

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


这将返回纯粹的类名,即使在使用命名空间时也是如此:

echo substr(strrchr(__CLASS__, "\\"), 1);

从 PHP 8.0开始,甚至可以在对象上使用 ::class:

$object = new \SplPriorityQueue();


assert($object::class === \SplPriorityQueue::class);