dvaknheo
V2EX  ›  PHP

要实现调用方式不变实质内容改变,依赖注入容器并并非最优解唯一解

  •  
  •   dvaknheo · Mar 16, 2019 · 3046 views
    This topic created in 2655 days ago, the information mentioned may be changed or developed.

    可变单例才是王道 先上代码

    <?php
    trait DNSingleton
    {
      protected static $_instances=[];
      public static function G($object=null)
      {
        if(defined('DNMVCS_DNSINGLETON_REPALACER')){
          $callback=DNMVCS_DNSINGLETON_REPALACER;
          return ($callback)(static::class,$object);
        }
        if($object){
          self::$_instances[static::class]=$object;
          return $object;
        }
        $me=self::$_instances[static::class]??null;
        if(null===$me){
          $me=new static();
          self::$_instances[static::class]=$me;
        }
        return $me;
      }
    }
    class BaseClass
    {
      use DNSingleton;
      public function foo(){ echo "新年快乐\n"; }
    }
    class MyClass extends BaseClass
    {
      public function foo(){ echo "猪年快乐\n"; }
    }
    
    BaseClass::G()->foo();
    BaseClass::G(MyClass::G());
    BaseClass::G()->foo();
    

    输出:

    新年快乐
    猪年快乐
    

    都是调用 BaseClass::G()->foo(); ,前一个输出 新年快乐 ,后一个输出 猪年快乐

    不用配置什么东西,只要在调用前替换就行

    这个 G 函数是从 https://github.com/dvaknheo/DNMVCS 这个框架提出来的。并克隆用于。

    https://github.com/dvaknheo/SwooleHttpd

    这个 swoole 项目。在 SwooleHttpd 项目中,替换 DNMVCS_DNSINGLETON_REPALACER ,实现了 协程单例

    对这个 G 函数有什么要问的? 鼓励我一下.

    4 replies    2019-03-17 17:16:22 +08:00
    jhdxr
        1
    jhdxr  
       Mar 16, 2019
    在调用前替换。。。
    那和我在调用前先去 new 一个有什么区别。。。
    GM
        2
    GM  
       Mar 16, 2019
    没看出来你想解决什么问题。莫非你想用这个 G 函数代替依赖注入容器?
    Varobjs
        3
    Varobjs  
       Mar 17, 2019 via Android
    单例有单例的好处,di 有 di 的好处,不要总想着用 a 替换 b。合适的地方用合适的工具不好吗?软件工程哪来的银弹和一把梭子
    dvaknheo
        4
    dvaknheo  
    OP
       Mar 17, 2019
    没看出来你想解决什么问题。莫非你想用这个 G 函数代替依赖注入容器?

    是的,比如框架代码出安全漏洞,要用外部修补手段。
    传统的框架只能强改代码
    依赖注入容器方式需要重新配置。
    依赖注入容器需要配置,可变单例不需要配置。


    那和我在调用前先去 new 一个有什么区别。。。

    有区别,作用域未知,没法手工在第三方代码里挨个替换。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1068 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 18:23 · PVG 02:23 · LAX 11:23 · JFK 14:23
    ♥ Do have faith in what you're doing.