<?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