如何在PHP中获取类名?
在Java中,我们可以使用如何在PHP中获取类名?,php,Php,在Java中,我们可以使用String className=MyClass.class.getSimpleName()获取类名 如何在PHP中实现这一点?我已经知道了,但它只适用于对象。目前我在Active Record工作。我需要类似于MyClass::className的语句,您可以在类中使用\uuuu CLASS\uuuuu来获取名称 听起来你回答了自己的问题获取类将获取类名。这是程序性的,也许这就是造成混乱的原因。请看一看php文档中的 以下是他们的例子: public class My
String className=MyClass.class.getSimpleName()获取类名代码>
如何在PHP中实现这一点?我已经知道了,但它只适用于对象。目前我在Active Record工作。我需要类似于MyClass::className
的语句,您可以在类中使用\uuuu CLASS\uuuuu
来获取名称
听起来你回答了自己的问题<代码>获取类
将获取类名。这是程序性的,也许这就是造成混乱的原因。请看一看php文档中的
以下是他们的例子:
public class MyClass {
}
然而,这有点有限,因为如果我的类被扩展,它仍然会返回“MyClass”。相反,我们可以使用一个相对较新的特性,它需要PHP>=5.3
$className = MyClass::getClass();
现在,我有了问题的答案。感谢你的链接,我找到了答案。谢谢你的主意。我的解决方案:
<?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'
自PHP5.5以来,您可以通过ClassName::class使用类名解析
看
如果要在类方法中使用此功能,请使用static::class:
对于较旧版本的PHP,您可以使用。我认为重要的是要提到PHP中“自我”和“静态”之间的细微差别,因为“最佳答案”使用“静态”,这会给一些人带来混乱的结果
要获取类名,可以使用ReflectionClass
X: X, X
Y: Y, X
Z: Z, X
end(preg\u split(\\\\\\\\/)\\\\”,Class\u Name::Class))
Class\u Name::Class
:返回带有名称空间的类。因此,在您只需要创建一个数组之后,就可以得到数组的最后一个值。这似乎是一个非常有效的选择
class-MyClass{
公共功能测试(){
//“我的班级”
return(new\ReflectionClass($this))->getShortName();
}
}
基准:
class MyClass {
public function myNameIs(){
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]
你能给出一个在php中可能有用的具体例子吗?如果你已经硬编码了类名,你可以用引号括起来,得到你想要的。不幸的是,像RenameClass这样的自动重构(例如在IDE中)通常不会重命名这样的类名字符串。因此,除了执行public$\uuuuuuu class\uuuuuu=\uuuuu class\uuuuuu代码>与其他所有类共舞…您也可以在此处查看所有有趣的常量:感谢@Brad提供的链接,我找到了答案@user1073122,这是我在答案中链接到的链接。+1,因为我试图在父类中定义的方法中获取类名。其他解决方案(get_class($this)
,static::class
)只返回子类(扩展父类)类名。继续:self::class
,似乎也返回父类名称。感谢@J.Money的建议。。但它在继承中不起作用,毫无意义FooBar::getClassName()
始终是'FooBar'
。如果您可以键入产品::getClassName()
,那么您也可以键入“产品”
。是的,我知道。。我希望避免输入错误,并且在重新分解类名时(使用IDE工具),我不需要搜索和替换字符串。如果您需要在父“Model”类中使用子类的类名,这也会有所帮助。虽然此代码片段可能是解决方案,但确实有助于提高帖子的质量。请记住,您将在将来回答读者的问题,而这些人可能不知道您的代码建议的原因。绝对特别!!!这是一个超级但简单的解决方案!谢谢!!!!static::class
和get_class_name()
之间有什么区别?@AlexanderJank似乎static::class
是在编译时解决的,而get_class_name()
是在运行时解释的。我是通过尝试访问动态生成的类的::class属性(?)并获得以下错误而发现的:编译时::class fetch中不允许使用动态类名。有关更多详细信息,请参见此。我还发现这些文件对我很有帮助。
<?php
namespace CMS;
class Model {
const _class = __CLASS__;
}
echo Model::_class; // will return 'CMS\Model'
X: X, X
Y: Y, X
Z: Z, X
class MyClass {
public function myNameIs(){
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);