PHP从父类差异中获取子类名称
我想在父类构造中获取子类。问题是,我在这里找到了几个PHP方法,但不知道使用哪一个,哪一个更快PHP从父类差异中获取子类名称,php,class,constructor,Php,Class,Constructor,我想在父类构造中获取子类。问题是,我在这里找到了几个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 (
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
。但是为什么有三种不同的方法可以得到相同的结果呢?哪一个更好,或者更优化?这三个不同的版本代表了PHP处理静态数据的演变。最早的一个get_class
不足以处理需要区分调用的类和定义的类的场景
因此,PHP5.3中引入了名为get_的类,以解决歧义。这持续了相当长的一段时间,仍然是一个有效的选择,但现在我们有了伪选择器::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\Bza', 'hi' ], 'bishop'); // error at runtime!
但是使用::类
伪代码,我得到编译时检查:
call_user_func([ Bza::class, 'hi' ], 'bishop'); // error at compile-time!
我意识到在解释语言中,编译时和运行时之间的区别很小,但在性能方面确实很重要。这是第二个好处:
::class
的性能更高。这三个不同的版本代表了PHP处理静态数据的发展。最早的一个get_class
不足以处理需要区分调用的类和定义的类的场景
因此,PHP5.3中引入了名为get_的类,以解决歧义。这持续了相当长的一段时间,仍然是一个有效的选择,但现在我们有了伪选择器::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\Bza', 'hi' ], 'bishop'); // error at runtime!
但是使用::类
伪代码,我得到编译时检查:
call_user_func([ Bza::class, 'hi' ], 'bishop'); // error at compile-time!
我意识到在解释语言中,编译时和运行时之间的区别很小,但在性能方面确实很重要。这是第二个好处:
::类
的性能更高。为什么不运行一些性能测试来查看呢?问题不仅在于性能,还在于如果有其他差异,为什么会有3种方法用于相同的结果。get_class($this)
可以调用,用于传递任何对象的实例,包括(但不限于)$this
;e、 g.$x=新日期时间();echo get_类($x)<代码>;所以,get_class()`是一个非常通用的函数,有其他用途。为什么不运行一些性能测试来查看呢?问题不仅在于性能,还在于为什么有3个方法可以获得相同的结果,如果还有其他不同。get_class($this)
可以在任何对象的实例中调用,包括(但不限于)$this
;e、 g.$x=新日期时间();echo get_类($x)<代码>;因此get_class()`是一个非常通用的函数,还有其他用途。谢谢你,它实际上回答了我的问题。在我的情况下,我将使用::class
。谢谢,它实际上回答了我的问题。在我的情况下,我将使用::class
。