Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP从父类差异中获取子类名称_Php_Class_Constructor - Fatal编程技术网

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 (

我想在父类构造中获取子类。问题是,我在这里找到了几个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
。但是为什么有三种不同的方法可以得到相同的结果呢?哪一个更好,或者更优化?

这三个不同的版本代表了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