PHP 的 new static 和 new self 具体有什么?

下面我们举个栗子:

class Father {
    public static function getSelf() {
        return new self();
    }

    public static function getStatic() {
        return new static();
    }
}

class Son extends Father {}

echo get_class(Son::getSelf()); // Father
echo get_class(Son::getStatic()); // Son
echo get_class(Father::getSelf()); // Father
echo get_class(Father::getStatic()); // Father

new self

这里面注意这一行 get_class(Son::getStatic()); 返回的是 Son 这个 class,可以总结如下:
self 返回的是 new self 中关键字 new 所在的类中,比如这里例子的 :

public static function getSelf() {
    return new self(); // new 关键字在 Father 这里
}

始终返回 Father

new static

static 则上面的基础上,更聪明一点点:static 会返回执行 new static() 的类,比如 Son 执行 get_class(Son::getStatic()) 返回的是 Son, Father 执行get_class(Father::getStatic()) 返回的是 Father

而在没有继承的情况下,可以认为 new selfnew static 是返回相同的结果。

原文地址:PHP 的 new static 和 new self 具体有什么?

本作品采用《CC 协议》,转载必须注明作者和本文链接
不要轻易放弃。学习成长的路上,我们长路漫漫,只因学无止境 Don't give up easily. On the way of learning and growing up, we have a long way to go, just because there is no end to learning.
本帖由系统于 4年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

这个有个专有名词叫做:后期静态绑定,,,其实很简单的一个道理,被官方文档这么一个词一搞,我当时也晕了,,,

4年前 评论

这个有个专有名词叫做:后期静态绑定,,,其实很简单的一个道理,被官方文档这么一个词一搞,我当时也晕了,,,

4年前 评论

static 延迟静态绑定,有时候很有用的。 :grin:

4年前 评论
LOST

感谢大佬科普,后期静态绑定在框架里用的还是挺多的。

4年前 评论

其实就是 self: 返回当前方法所在的类,static:哪个类调用 就返回哪个类的区别

4年前 评论
fatrbaby

延迟绑定,比较基础的知识点。

4年前 评论
jiangjun

不错,今天看到代码里面就有。解答了今天的疑惑。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!