最近在深入研究面向对象,但是PHP中的一个关于this和self用法的例子引发了我的好奇。
首先看一段启发代码:
运行的结果是:
A load()
B load()
我看到这个结果的时候,有两个惊讶:
- self居然还能调用非静态方法!
- self调用的方法居然得到的是A的结果!
查了一些文档,包括 stackoverflow上的解释和一些博客,理解到如下问题:
- self常用于访问当前类的静态方法,但也可以访问实例方法。self只是当前类名的一个简写。
- $this指的是当前的实例,调用的方法要基于具体的类,会
默认进行向下转换
。
- 学到了关于后期静态绑定的一些东西,主要是self、static和parent的区别。
看下面例子:
结果是:
A load()
B load()
B load()
是的,同样令人震惊的有两点:
- $this也可以调用静态方法
static::load()
能够做到后期静态绑定,也就是会调用B的方法;而self::load()
只是当前类。