Эта тема на forum.dklab.ru


Maus: почему нельзя предотвратить создание объекта?
Вопрос может и глупый, но все-таки:
вот есть у меня некий класс, и в конструкторе проверяются некие условия. Если условия не выполняются - создавать объект бессмысленно. Но и самоуничтожиться изнутри объекта нельзя. Чем это продиктовано?
1) непределенностью возвращаемого значения. new четко возвращает объект. Если он сможет возвращать нечто иное, то а) код придется нагрузить лишними проверками и б) нужно еще и четкое соглашение (возвращаем null или false);
2) влиянием на ситуацию вне сферы ответственности класса. В смысле: переменная, содержащая объект, то ли уничтожится, то ли станет содержать не-объект. И вообще: не класс создает объект (он только управляет созданием) - не ему объект и грохать;
3) что-нибудь еще?
Александр Михалицын:
Maus,
объяви конструктор как private и используй паттерн "Factory".
Александр Михалицын:
Пример:

class A {
private function __construct() {}
public static function factory($arg1, $arg2, $arg3, $argN) {
//условия, проверки и пр.
//Создаем объект
return new self();
}
}

$a = A::factory();

Maus:
Александр Михалицын
это ответ на вопрос "как обычно действуют в такой ситуации", а не "почему дело обстоит вот так". Меня интересует как раз "почему". Про фабрики-то понятно..
Александр Михалицын:
Maus,
ну тогда я думаю это вопрос не столько по PHP, сколько в целом об ООП. (-;

Меня интересует как раз "почему".
Почему нельзя запретить предотвратить создание объекта? Можно его предотвратить - я выше пример привёл.
Или я что-то не понимаю? Опиши подробнее это "почему". (-;
dimagolov:
и в конструкторе проверяются некие условия.
вообще-то это неправильно. конструктор не должен исполнять какие-то действия, а только инициализировать объект.
но если хотите прерывать создание объекта, то Вы можете использовать исключения.
Maus:
Можно его предотвратить - я выше пример привёл
не, это ты предотвратил, мнээ, ну назовем это "неуправляемое" создание объекта. А мне хотелось избавиться от создания вообще.

Опиши подробнее это "почему"
приблизительно так:

class Emo
{
public function __construct()
{
if ( rand() )
{
unset($this);
return null;
}
}
}

пару вариантов, почему это может быть плохо, я привел.

конструктор не должен исполнять какие-то действия, а только инициализировать объект.
А, вот оно! Инициализация != создание. Спасибо.
Вот так засядет в голове "конструктор создает, деструктор уничтожает", а потом оттуда всякие тараканы лезут.
Maus:
закрывать или кто-то хочет высказаться?
Юрий Насретдинов:
Maus
Можно кинуть исключение внутри конструктора. Насколько я понимаю, именно так разработчики и предлагают «предотвращать создание объекта» :).
Maus:
Юрий Насретдинов
ну, это совсем жестоко. Но зато теперь-то тема исчерпана!
Maus:
Тема закрыта.

Эта тема на forum.dklab.ru