构造函数内的 php 对象缓存

Ber*_*idt 3 php constructor caching factory

我希望能够通过使用构造函数而不是某些工厂方法来使用对象的透明(穷人)缓存。

$a = new aClass();应该检查该对象是否存在于缓存中,如果不存在,则创建它并将其添加到缓存中。

一些伪代码:

class aClass {
    public function __construct($someId) {
        if (is_cached($someId) {
            $this = get_cached($someId);
        } else {
            // do stuff here
            set_cached($someId, $this);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是不可能的,因为你不能$this在 php 中重新定义。

有什么建议么?

Gor*_*don 5

这是行不通的,因为 ctor 不会返回,并且您无法重新定义$this

您可以使用静态工厂方法来代替:

class Foo
{
    protected static $instances = array();

    public function getCachedOrNew($id)
    {
        if (!isset(self::$instances[$id])) {
            self::$instances[$id] = new self;
        }
        return self::$instances[$id];
    }
}

$foo = Foo::getCachedOrNew(1);
$foo->bar = 1;
$foo = Foo::getCachedOrNew(1);
echo $foo->bar; // 1
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用可以管理对象实例的依赖注入容器(DIC)。查看Symfony 组件 DIC。为了这。