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

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



  • 相关阅读:
    Aptana 开发环境执行时默认的工作路径
    python 日志工具 Dict4ini 的简单使用示例
    C语言中的条件编译
    Ammyy Admin 一个小巧方便的远程管理工具
    djangoevolution 插件维持Django 模型和数据库结构一致的基本原理
    关于Django 框架的ContentType 模型
    关于 Django web请求中的Cookie
    GridView中,显示记录的总条数
    SQL 日期格式
    .net如何实现页面间的参数传递
  • 原文地址:https://www.cnblogs.com/itsuibi/p/10903998.html
Copyright © 2011-2022 走看看