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
.
从 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()。
您可以__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'
要获取类名,您可以使用 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]
现在,我的问题有了答案。感谢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"
我认为在 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
即使使用命名空间,这也会返回纯类名:
echo substr(strrchr(__CLASS__, "\\"), 1);
end(preg_split("#(\\\\|\\/)#", Class_Name::class))
Class_Name::class
:返回具有命名空间的类。所以之后只需要创建一个数组,然后获取数组的最后一个值。
<?php
namespace CMS;
class Model {
const _class = __CLASS__;
}
echo Model::_class; // will return 'CMS\Model'
适用于PHP 5.5之前的版本