可变单例才是王道 先上代码
<?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 函数有什么要问的? 鼓励我一下.
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 一个有什么区别。。。 有区别,作用域未知,没法手工在第三方代码里挨个替换。 |