『new static()』和『new self()』的区别

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

/**
 * Father
 */
class Father
{
    public function newInstanceByStatic(): static
    {
        return new static(); // 重要说明:static()会受继承关系影响,即子类调用本方法创建的是子类实例,而不是Father实例
    }

    public function newInstanceBySelf(): self
    {
        return new self(); // 重要说明:self()不受继承关系影响,即子类调用本方法创建的是Father实例,而不是子类实例
    }
}

/**
 * Son
 */
class Son extends Father
{
}

/**
 * Grandson
 */
class Grandson extends Son
{
}

$grandson = new Grandson();
$grandsonStatic = $grandson->newInstanceByStatic();
$grandsonSelf = $grandson->newInstanceBySelf();
echo $grandsonStatic::class . PHP_EOL; // Grandson
echo $grandsonSelf::class . PHP_EOL; // Father


//========== 总结 ==========//
// 1、在没有继承关系的前提下,static()和self()的效果是完全一样的,只有在有继承关系的前提下(其实就是子类),两者才能体现出不同。
// 2、简单粗暴地说,『new self()』写在哪个类,创建的就是该类的实例,它不会因为继承关系而变化。
// 3、一般来说使用static即可,因为很少有需要通过子类来创建父类的情况,只有出现需要创建父类实例,但又不知道父类名的这种奇怪状况
//    才会用到self。

Copyright © 2024 码农人生. All Rights Reserved