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

2019-03-16 20:47:19 +08:00
 dvaknheo

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

<?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 函数有什么要问的? 鼓励我一下.

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

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


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

有区别,作用域未知,没法手工在第三方代码里挨个替换。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/545333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX