
可变单例才是王道 先上代码
<?php trait DNSingleton { protected static $_instances=[]; public static function G($object=null) { if(defined('DNMVCS_DNSINGLETON_REPALACER')){ $callback=DNMVCS_NSINGLETON_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 函数有什么要问的? 鼓励我一下.
1 jhdxr 2019-03-16 21:03:58 +08:00 在调用前替换。。。 那和我在调用前先去 new 一个有什么区别。。。 |
2 GM 2019-03-16 21:04:10 +08:00 没看出来你想解决什么问题。莫非你想用这个 G 函数代替依赖注入容器? |
3 Varobjs 2019-03-17 11:56:16 +08:00 via Android 单例有单例的好处,di 有 di 的好处,不要总想着用 a 替换 b。合适的地方用合适的工具不好吗?软件工程哪来的银弹和一把梭子 |
4 dvaknheo OP 没看出来你想解决什么问题。莫非你想用这个 G 函数代替依赖注入容器? 是的,比如框架代码出安全漏洞,要用外部修补手段。 传统的框架只能强改代码 依赖注入容器方式需要重新配置。 依赖注入容器需要配置,可变单例不需要配置。 那和我在调用前先去 new 一个有什么区别。。。 有区别,作用域未知,没法手工在第三方代码里挨个替换。 |