简单易懂 —— this、self、static 的区别

简介

如果是刚入门不久或较少比较久未使用者,往往比较容易搞混这三者之间的关系,网上的文章五花八门,不够简洁

在接下来的文章里,将省去干扰与花里胡哨的东西

读这文章需要理解的基本知识:PHP 继承、封装、多态

this

英文解释:这,这个

基本概念

当一个方法在类定义内部被调用时,有一个可用的伪变量 $this。$this 是一个到主叫对象的引用(通常是该方法所从属的对象,但如果是从第二个对象静态调用时也可能是另一个对象)。

this 就是表示当前对象,从当前对象依次往上找,不存在或无权限则报错

self

英文解释:自己

后期静态绑定与非转发调用

使用 self:: 或者 CLASS 对当前类的静态引用,取决于定义当前方法所在的类

self::test 使用的『类』依次往上找 test(重写优先),不存在或无权限则报错

在使用 self::test 时就得保证 test 是存在滴

static

英文解释:静态

后期静态绑定与非转发调用

该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。

运行时,static::test 从最后的子『类』依次往上找 test(子类优先),不存在或无权限则报错国

在使用 static::testtest 可以不存在,运行时 test 存在即可

本作品采用《CC 协议》,转载必须注明作者和本文链接
光年之外
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4

$this 调用类实例

self 类自身

static 调用类

有错请指正~

5年前 评论
黑将军

这样说我更不懂了,直接上例子

5年前 评论

这样说我更不懂了,直接上例子

5年前 评论

@黑将军
@生活无限好

为什么不直接上例子

this、self、static 配合继承、封装、多态,变化相当复杂,也不是一两个,三四个例子就能说清楚滴,这文章是比较抽象的,并不关心过多细节(类似总结吧)

需要的知识

理解 PHP 继承、封装、多态

建议

『必须』要结合继承、封装、多态思考

例子

下面给了个简单粟子,更多粟子请看 官网,再自己加入继承、封装、多态特性,测试粟子

注意:例子是文档的阉割版

class A {
    public static function foo() {
         echo 'A-foo<br>';
    }
}

class B extends A {

    public static function test() {
        A::foo();  // 结果:A-foo
        static::foo(); // 结果:C-foo
        self::foo(); // 结果:B-foo
    }

    public static function foo()
    {
        echo 'B-foo<br>';
    }
}

class C extends B {

    public static function foo()
    {
        echo 'C-foo<br>';
    }
}

C::test();
5年前 评论

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