Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中获取类名?_Php - Fatal编程技术网

如何在PHP中获取类名?

如何在PHP中获取类名?,php,Php,在Java中,我们可以使用String className=MyClass.class.getSimpleName()获取类名 如何在PHP中实现这一点?我已经知道了,但它只适用于对象。目前我在Active Record工作。我需要类似于MyClass::className的语句,您可以在类中使用\uuuu CLASS\uuuuu来获取名称 听起来你回答了自己的问题获取类将获取类名。这是程序性的,也许这就是造成混乱的原因。请看一看php文档中的 以下是他们的例子: public class My

在Java中,我们可以使用
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);