V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dvaknheo
V2EX  ›  PHP

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

  •  
  •   dvaknheo · 2019-03-16 20:47:19 +08:00 · 2551 次点击
    这是一个创建于 2082 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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


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

    有区别,作用域未知,没法手工在第三方代码里挨个替换。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2742 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:31 · PVG 23:31 · LAX 07:31 · JFK 10:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.