【问题标题】:Difference between ::class and get_class::class 和 get_class 之间的区别
【发布时间】:2015-12-06 14:52:47
【问题描述】:

你能解释一下get_class($instance)ClassName::class之间的区别吗?

<?php
// PHP 5.5
var_dump(get_class(new Datetime())); // string(8) "DateTime" 
var_dump(Datetime::class); // string(8) "Datetime" with lower t

【问题讨论】:

    标签: php


    【解决方案1】:

    类名在 PHP 中不区分大小写。

    似乎get_class($obj) 返回真正的类名(在 PHP 核心中),::class 返回用户代码中使用的类名。

    <?php
    // PHP 5.5
    var_dump(get_class(new DaTeTImE())); // string(8) "DateTime" 
    var_dump(DaTeTImE::class);           // string(8) "DaTeTImE"
    

    // 来自 PHP 团队: '::class' 构造纯粹在编译时完成,基于传入的明显类名。它不检查实际类名的拼写,甚至不检查该类是否存在

    <?php
    echo dAtEtImE::class; // Output is "dAtEtImE"
    echo ThisDoesNotExist::class; // Output is "ThisDoesNotExist"
    

    【讨论】:

      【解决方案2】:

      还有一点,get_class 以实例为参数,::class 直接对类定义进行操作,无需初始化任何实例。您可能希望在不偶尔创建实例的情况下获取类名。

      【讨论】:

      • 要补充这个答案,您不能在实例上使用::class,而您可以使用get_class()。例如,如果您使用了$d = new DateTime(),则不能使用$d::class
      • @AmbientCyan 但是::class 也可以用于实例。
      【解决方案3】:

      没有区别,这只是两种编码风格。

      【讨论】:

      • 那为什么get_class(new Datetime())不严格等于Datetime::class
      • 您在哪里看到了不同之处?
      • 日期时间和带上 T 的日期时间
      • @Raphaël Vigée 他们可能会返回大小写不同的字符串,这可能会破坏您的代码。
      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 2012-01-13
      • 2014-01-31
      • 2018-11-02
      • 2016-04-13
      • 2011-06-09
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多