欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【静态延迟加载】self关键字和static关键字的区别

程序员文章站 2022-10-06 12:18:50
先来看下代码,从代码中发现问题、解决问题 上面是一个很经典很普通的工厂模式代码,我们期望的是输出各自手机的品牌名称,但是结果显示的是父类中的品牌名称。这说明我们调用的 self 关键代表的是代码中它所在的那个类 即 Phone 这个类 这里我们只是将 self 关键字改为了 static 关键字,当 ......

先来看下代码,从代码中发现问题、解决问题

//先实现一个手机工厂类
class phone{
    
    public static function setbrand(){
        echo "main phone";
    }

    public static function getbrand(){
        self::setbrand();
    }

}
//huawei 手机工厂
class huawei extends phone{
    public static function setbrand(){
        echo "huawei phone";
    }
}
//xiaomi 手机工厂
class xiaomi extends phone{
    public static function setbrand(){
        echo "xaiomi phone";
    }
}

huawei::getbrand(); // main phone
xiaomi::getbrand(); // main phone

上面是一个很经典很普通的工厂模式代码,我们期望的是输出各自手机的品牌名称,但是结果显示的是父类中的品牌名称。这说明我们调用的 self 关键代表的是代码中它所在的那个类 即 phone 这个类

//先实现一个手机工厂类
class phone{
    
    public static function setbrand(){
        echo "main phone";
    }

    public static function getbrand(){
        static::setbrand(); //将 self 改为 static
    }

}
//huawei 手机工厂
class huawei extends phone{
    public static function setbrand(){
        echo "huawei phone";
    }
}
//xiaomi 手机工厂
class xiaomi extends phone{
    public static function setbrand(){
        echo "xaiomi phone";
    }
}

huawei::getbrand(); // huawei phone
xiaomi::getbrand(); // xiaomi phone

这里我们只是将 self 关键字改为了 static 关键字,当值行代码时 这里的static代表的是当前正在执行的类 例如执行 

huawei::getbrand(); 时 static 代表的是 huawei
xiaomi::getbrand(); 时 static 代表的是 xiaomi

  这里总结一下 静态延迟加载的含义:把本来在定义阶段固定下来的表达式或变量,改在执行阶段再决定。