2011-08-20 2 views
0

Я хочу сделать некоторый кэш в моем ORMОтдельных статические переменные для каждого ребенка

class Base { 

    static public $v=array(); 
    static public function createById($id){ 
     if(!array_key_exists($id, static::$v)){ 
      static::$v[$id] = new static; //Get from DB here. new static is just example 
     } 
     return static::$v[$id]; 
    } 

} 

class User extends Base{ 

} 
class Entity extends Base{ 

} 

Но теперь кэш объединяются

var_dump(User::createById(1)); 
var_dump(Entity::createById(1)); 

результаты

object(Model\User)#4 (0) { 
} 
object(model\User)#4 (0) { 
} 

Если бы я сделал

class Entity extends Base{ 
    static public $v=array(); 
} 
class User extends Base{ 
    static public $v=array(); 
} 

я получаю то, что мне нужно:

object(Model\User)#4 (0) { 
} 
object(model\Entity)#5 (0) { 
} 

Можно ли сделать это без объявления в каждом классе?

ответ

1

Если важно, чтобы вы не повторно объявляли свойство в каждом дочернем классе, единственное решение, о котором я могу думать, это не то, что вы хотели, но оно должно обеспечить вам ту же функциональность, делится тем же свойством на базовый класс для хранения кэша для всех дочерних классов, но используя имя класса ребенка в качестве ключа в массиве кэша:

class Base { 
    public static $v=array(); 
    public static function createById($id){ 
     $called = get_called_class(); 
     if (!isset(self::$v[$called])) { 
      self::$v[$called] = array(); 
     } 
     $class_cache = &self::$v[$called]; 
     if(!array_key_exists($id, $class_cache)){ 
      $class_cache[$id] = new static; 
     } 
     return $class_cache[$id]; 
    } 
} 

Да, его не очень ... но AFAIK , то, что вы просили, невозможно.

+0

Во всяком случае, это более красиво, чем redeclare в каждом классе для детей :) 1 после того, как вы извините, больше не думайте об этом, спасибо. – RiaD

Смежные вопросы