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