Кэширование PHP-объектов в конструкторе - PullRequest
1 голос
/ 07 марта 2012

Я хотел бы иметь возможность использовать прозрачное (плохое управление) кэширование объектов, используя конструктор, а не какой-либо фабричный метод.

$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);
        }
    }
}

К сожалению, это невозможно, потому что вы не можете переопределить $this в php.

Есть предложения?

1 Ответ

3 голосов
/ 07 марта 2012

Это не будет работать, потому что ctors не возвращаются, и вы не можете переопределить $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

Другой альтернативой может быть использование контейнера внедрения зависимостей (DIC), который может управлять экземплярами объектов. Посмотрите на Компонент Symfony DIC. для этого.

...