区别讲解PHP中的self和static调用静态方法

self:: 和 static:: 纯理论区别(不结合任何业务)

核心概念

  1. self:静态早期绑定(编译时绑定)
     
    编译阶段就锁定了「当前写代码的这个类」,不会跟随调用方变化。
  2. 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:看谁发起调用,动态绑定运行时子类。
posted @ 2026-07-09 10:10  技艺追求者  阅读(2)  评论(0)    收藏  举报