zoukankan      html  css  js  c++  java
  • 【静态延迟加载】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

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



  • 相关阅读:
    js实现粘贴板复制
    oracle分页查询
    [小技巧]window10删除此电脑左侧栏中的非磁盘文件夹
    [web]2019第一起数据泄露事件
    [xml]AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getroot'
    [python]Mongodb
    [urllib]urlretrieve在python3
    [flask]邮件配置-20171227
    [PowerShell]Python虚拟环境激活失败
    [git]git入门
  • 原文地址:https://www.cnblogs.com/itsuibi/p/10903998.html
Copyright © 2011-2022 走看看