【问题标题】:How do I get class name in PHP?如何在 PHP 中获取类名?
【发布时间】:2020-11-10 07:24:45
【问题描述】:
public class MyClass {

}

在Java中,我们可以使用String className = MyClass.class.getSimpleName();获取类名

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

【问题讨论】:

  • 你能举一个具体的例子吗?它可能对 php 有帮助吗?如果您对类名进行了硬编码 - 您可以将其用引号括起来并得到您想要的。
  • 不幸的是,像 RenameClass 这样的自动重构(例如在 IDE 中)通常不会重命名此类名称字符串。因此,最好有某种静态方式来获取类名,除了与其他所有类一起跳舞 public $__CLASS__ = __CLASS__;...

标签: php


【解决方案1】:

自 PHP 5.5 起,您可以通过 ClassName::class 使用类名解析。

new features of 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()

【讨论】:

  • static::classget_class_name()有什么区别?
  • @AlexanderJank 似乎static::class 在编译时被解析,而get_class_name() 在运行时被解释。我通过尝试访问动态生成的类的 ::class 属性(?)并得到以下错误发现了这一点:Dynamic class names are not allowed in compile-time ::class fetch。有关更多详细信息,请参阅此answer。我还发现文档中的 this note 很有帮助。
【解决方案2】:

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

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

【讨论】:

  • 你也可以在这里查看所有有趣的 const :php.net/manual/en/language.constants.predefined.php
  • 感谢@Brad 提供链接,我找到了答案here
  • @user1073122,这是我在回答中链接到的链接。
  • +1 因为我试图在父类中定义的方法中获取类名。其他解决方案(get_class($this)static::class)只返回子(扩展父)类名。
  • 继续self::class 似乎也返回了父类名称。
【解决方案3】:

听起来您回答了自己的问题。 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,它依赖于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'

【讨论】:

  • 感谢@J.Money 的想法。但它在继承中不起作用。
【解决方案4】:

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

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

【讨论】:

  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • 绝对特别!!!这是一个超级但简单的解决方案!谢谢!!!!
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    现在,我的问题有了答案。感谢Brad 的链接,我找到了答案here。感谢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" 
    

    【讨论】:

    • 这毫无意义。 FooBar::getClassName() 始终是 'FooBar'。如果您可以输入Product::getClassName() - 那么您也可以输入'Product'
    • 是的,我知道.. 我想避免拼写错误,并且在重构类名时(使用 IDE 工具),我不需要搜索和替换字符串。
    • 如果您需要在父“模型”类中使用子类的类名,这也会有所帮助。
    【解决方案7】:

    我认为在 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
    

    【讨论】:

    • 太棒了!谢谢。
    【解决方案8】:

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

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

    【讨论】:

      【解决方案9】:

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

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

      【讨论】:

        【解决方案10】:
        <?php
        namespace CMS;
        class Model {
          const _class = __CLASS__;
        }
        
        echo Model::_class; // will return 'CMS\Model'
        

        对于早于 PHP 5.5

        【讨论】:

          猜你喜欢
          • 2013-03-09
          • 2011-04-06
          • 2019-11-11
          • 2011-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多