PHP的new self() 与new static()
参考链接:【PHP中new static()与new self()的区别异同分析】,【PHP中new self()和new static()的区别探究】,【PHP中static和self的区别】
要点其实是理解概念:
还是看看老外的专业解释吧:
self refers to the same class whose method the new operation takes place in.
译:self指那些方法被重写的类。tip:如果继承层次深(如继承深度大于1),当前子类没有重写父类方法,那么就需要找到最后一个方法被重写的类;如果是当前类重写的话,那当然就直接是当前类咯。
static in PHP 5.3's late static bindings refers to whatever class in the hierarchy which you call the method on.
译:static指当你所调用的方法所在的类。tip:其实这个就不用管继承了,永远都是当前类,不用管父类。
一、只有一层继承:
看代码:

class Father { public function getNewFather() { return new self(); } public function getNewCaller() { return new static(); } } class Sun1 extends Father { } class Sun2 extends Father { } $sun1 = new Sun1(); $sun2 = new Sun2(); print '$sun1->getNewFather():'.get_class($sun1->getNewFather()); echo '<br>'; print '$sun1->getNewCaller():'.get_class($sun1->getNewCaller()); echo '<br>'; print '$sun2->getNewFather():'.get_class($sun2->getNewFather()); echo '<br>'; print '$sun2->getNewCaller():'.get_class($sun2->getNewCaller()); echo '<br>'; echo '<br>';
结果:
$sun1->getNewFather():Father $sun1->getNewCaller():Sun1 $sun2->getNewFather():Father $sun2->getNewCaller():Sun2
二、有两层继承
看代码:

class Father { public function getNewFather() { return new self(); } public function getNewCaller() { return new static(); } } class Sun1 extends Father { public function getNewFather() { return new self(); } public function getNewCaller() { return new static(); } } class Sun2 extends Father {} class subSun1 extends Sun1{} class subSub2 extends Sun2{} $sun1 = new Sun1(); $sun2 = new Sun2(); $subSun1=new subSun1(); $subSub2=new subSub2(); print '$sun1->getNewFather():'.get_class($sun1->getNewFather()); echo '<br>'; print '$sun1->getNewCaller():'.get_class($sun1->getNewCaller()); echo '<br>'; print '$sun2->getNewFather():'.get_class($sun2->getNewFather()); echo '<br>'; print '$sun2->getNewCaller():'.get_class($sun2->getNewCaller()); echo '<br>'; echo '<br>'; print '$subSun1->getNewFather():'.get_class($subSun1->getNewFather()); echo '<br>'; print '$subSun1->getNewCaller():'.get_class($subSun1->getNewCaller()); echo '<br>'; print '$subSun2->getNewFather():'.get_class($subSub2->getNewFather()); echo '<br>'; print '$subSun2->getNewCaller():'.get_class($subSub2->getNewCaller());
结果:
$sun1->getNewFather():Sun1
$sun1->getNewCaller():Sun1
$sun2->getNewFather():Father
$sun2->getNewCaller():Sun2
$subSun1->getNewFather():Sun1
$subSun1->getNewCaller():subSun1
$subSun2->getNewFather():Father
$subSun2->getNewCaller():subSub2
分类:
PHP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)