На самом деле это интересный вопрос, и его легко (но безобразно) исправить (см. Ниже).
Поэтому я спрашиваю, есть ли лучший способ сделать это.
Я хотел бы, чтобы конструктор объекта возвращал что-то еще, а не новый экземпляр.
Вот пример того, чего я пытаюсь достичь:
$GLOBALS['object_cache']=array();
class Test {
public function __construct($id=0){
if(isset( $GLOBALS['object_cache'][$id] ))
return $GLOBALS['object_cache'][$id];
$GLOBALS['object_cache'][$id]=$this;
}
}
$t0=new Test(0);
$t1=new Test(1);
$t01=new Test(0);
// modifying $t01 would presumably also modify $t0
Легкое (но безобразное?) Исправление:
$GLOBALS['object_cache']=array();
class Test {
public static function create($id=0){
if(isset( $GLOBALS['object_cache'][$id] ))
return $GLOBALS['object_cache'][$id];
$new=new Test();
$GLOBALS['object_cache'][$id]=$new;
return $new;
}
}
$t0=Test::create(0);
$t1=Test::create(1);
$t01=Test::create(0);
// modifying $t01 would presumably also modify $t0
Что вы, ребята, думаете? Кстати, пример 1 не работает; он возвращает новый экземпляр независимо от оператора return.
Так я что-то упустил или лучше второй?
PS: Нет необходимости указывать очевидное в отношении паттернов (фабрика / синглтон) ...