PHP从父类差异中获取子类名

时间:2016-05-20 14:49:47

标签: php class constructor

我想在父类构造中获取子类。问题是,我在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种不同的方法可以得到相同的结果呢?哪一个更好,或更优化?

1 个答案:

答案 0 :(得分:4)

三个不同的版本代表了PHP处理静态的演变。最早的get_class不足以处理需要将类区分为和类定义为的情况。 Here is an example

因此,在PHP 5.3中引入了get_called_class来解决模糊性问题。这持续了一段时间,仍然是一个有效的选择,但现在我们有了伪选择器::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性能更高。