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

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



  • 相关阅读:
    工作流二次开发之新增表单实践(二)
    layui表格及工作流二次开发实践(一)
    记一个递归封装树形结构
    SpringCloud微服务之宏观了解
    统一结果返回&统一异常处理
    mybatis-Plus 实践篇之CRUD操作
    修改MariaDB-root密码
    iftop-监控服务器实时带宽情况
    Wordpress安装-报错说明
    MariaDB忘记root密码
  • 原文地址:https://www.cnblogs.com/itsuibi/p/10903998.html
Copyright © 2011-2022 走看看