PHP OO Отмена строительства - PullRequest
1 голос
/ 01 ноября 2010

На самом деле это интересный вопрос, и его легко (но безобразно) исправить (см. Ниже).

Поэтому я спрашиваю, есть ли лучший способ сделать это.

Я хотел бы, чтобы конструктор объекта возвращал что-то еще, а не новый экземпляр.

Вот пример того, чего я пытаюсь достичь:

$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: Нет необходимости указывать очевидное в отношении паттернов (фабрика / синглтон) ...

Ответы [ 3 ]

4 голосов
/ 01 ноября 2010
  1. OMG. Конструктор не может ничего вернуть.
  2. Это называется шаблоном фабричного метода http://en.wikipedia.org/wiki/Factory_method_pattern, и это обычная практика для создания объектов.

пс: Храните экземпляры в переменной класса static, и второе решение не будет таким странным, как сейчас.

2 голосов
/ 01 ноября 2010

Вы также можете использовать процедурную версию:

class Test {
    function __construct($i) {}
}
function Test($i) {
    static $cache;
    if (isset($cache[$i])) {
        return $cache[$i];
    }
    else { 
        return $cache[$i] = new Test($i);
    }
}

Это немного приятнее для глаз и позволяет, например, мгновенные беглые Test(1)->do()->else() звонки.

1 голос
/ 01 ноября 2010

По сути, вы пытаетесь реализовать шаблон Singleton в сочетании с шаблоном Factory method . Любой должен иметь возможность рассказать, как это работает, если вы задокументируете это в своей технической документации (и в ваших комментариях), так что можно использовать первый способ.

Второе решение на самом деле кажется менее очевидным для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...