【问题标题】:PHP Get child class name from parent class differencesPHP从父类差异中获取子类名称
【发布时间】:2016-09-17 21:42:00
【问题描述】:

我想在父类构造中获取子类。问题是,我在 SO 中找到了几个 PHP 方法,不知道用哪个,哪个更快?

class Parent {
    function __construct() {
        echo static::class;      // Method 1 (PHP 5.5+)
        echo get_called_class(); // Method 2 (PHP 5.3+)
        echo get_class($this);   // Method 3 (PHP 5.2+)
    }
}
class Child extends Parent {
    function __construct() {
        parent::__construct();
    }
}

所有回显都写入相同的结果:Child。但是为什么相同的结果有 3 种不同的方法呢?哪个更好,或者更优化?

【问题讨论】:

  • 你为什么不运行一些性能测试看看?
  • 问题不只是关于性能,还有为什么有3种方法可以得到相同的结果,如果有其他区别的话。
  • get_class($this) 可以调用传入任何对象的实例,包括(但不限于)$this;例如$x = 新日期时间(); echo get_class($x);; so get_class()` 是一个非常通用的函数,还有其他用途

标签: php class constructor


【解决方案1】:

三个不同的版本代表了 PHP 处理静态的演变。最早的get_class 不足以处理需要区分类as called 和类as defined 的场景。 Here is an example

因此,get_called_class 在 PHP 5.3 中被引入以解决歧义。这持续了很长一段时间,仍然是一个有效的选择,但现在我们有了伪选择器::class。为什么?

伪选择器提供了两个很好的好处。第一个是它允许您使用命名空间规则的编译时检查来替换字符串类名。比较:

 namespace Foo\Bar;
 class Baz { public static function hi($name) { echo "Hi, $name!"; } }
 call_user_func([ Baz::class, 'hi' ], 'bishop');

与:

 call_user_func([ '\Foo\Bar\Baz', 'hi' ], 'bishop');

如果我最后一个手指变粗了,打错了,那将是一个运行时错误:

 call_user_func([ '\Foo\Bar\Bza', 'hi' ], 'bishop'); // error at runtime!

但是使用::class 伪我得到编译时检查:

 call_user_func([ Bza::class, 'hi' ], 'bishop'); // error at compile-time!

我意识到,在解释型语言中,编译时和运行时之间的区别很小,但在性能方面确实很重要。这就是第二个好处:::class 的性能更高。

【讨论】:

  • 谢谢,它确实回答了我的问题。在我的情况下,我将使用::class
猜你喜欢
  • 2012-03-23
  • 2016-06-25
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多