区别讲解PHP中的self和static调用静态方法
self:: 和 static:: 纯理论区别(不结合任何业务)
核心概念
self:静态早期绑定(编译时绑定)编译阶段就锁定了「当前写代码的这个类」,不会跟随调用方变化。static:静态延迟绑定(运行时绑定)运行时才判断「实际发起调用的类」,会跟随子类变化。
1. 针对静态方法调用
self:: 方法 ()
永远执行当前代码所在类里的方法,无视子类是否重写。
static:: 方法 ()
执行实际运行调用的子类重写后的方法。
示例:
php
运行
class A
{
public static function test()
{
echo "A";
}
public static function runSelf()
{
self::test();
}
public static function runStatic()
{
static::test();
}
}
class B extends A
{
public static function test()
{
echo "B";
}
}
B::runSelf(); // 输出 A self固定指向代码所在类A
B::runStatic(); // 输出 B static指向实际调用类B
2. 针对静态属性 self::$prop / static::$prop
self::$xxx
读取、修改当前代码文件所属类的静态属性。
static::$xxx
读取、修改运行时实际调用子类的静态属性。
php
运行
class A
{
protected static $num = 1;
public static function getSelf()
{
return self::$num;
}
public static function getStatic()
{
return static::$num;
}
}
class B extends A
{
protected static $num = 999;
}
echo B::getSelf(); // 1 读A的$num
echo B::getStatic(); // 999 读B的$num
3. 针对常量 self::CONST / static::CONST
规则同上:
self::常量:固定取当前类常量static::常量:取子类重写后的常量
4. 针对 __CLASS__ / static::class
__CLASS__:等同于 self,永远是当前代码所在类名static::class:运行时真实调用类名
5. 一句话极简总结
self:看代码写在哪,固定绑定当前文件类;static:看谁发起调用,动态绑定运行时子类。
魏巍周山,似曾乡山,凭窗远望,似曾南北。
浙公网安备 33010602011771号