[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удаление объекта при создании
Hetman
Здравствуйте всем!

Учу уроки по ООП.
Столкнулся с таким вопросом.
При создании объекта, можно ли принять решение его не создавать при определенных условиях?
Т.е. есть ли возможность разрушить объект при выходе из конструктора?
Погуглив интернет обнаружил такие ответы знатоков.
Цитата
Профессиональное программирование на PHP писал(а):
Обработка сбоя конструктора представляет собой сложную задачу. Конструктор класса в PHP должен вернуть экземпляр данного класса, поэтому варианты ограниченны.

1. В объекте можно использовать инициализированный атрибут для отметки объекта как корректно инициализированного.
2. Можно не выполнять инициализацию в конструкторе.
3. В конструкторе можно сгенерировать исключение.


1. Ну это вообще не рассматривается.
2. Инициализацию чего? каких-то свойств? и что? объект все равно создастся...
3. При генерации исключения в конструкторе, объект все равно создается!

Большинство корифеев советуют использовать исключения, но, повторюсь, исключение проблему не решает - ошибка отработает, но объект будет создан.

Есть еще красивый вариант (на мой взгляд самый лучший)
 <?
class
easy {
static function factory($i = 0) {
return $i>1 ? new self($i) : 0;
}
}


$a = easy::factory(); // $a == 0

Но все равно это не то. Заменяется стандартный способ создания объекта через new, а это не есть красиво.
А другое что-то кто-нибудь знает?
Меня интересует конкретно отмена создания объекта при вызове new class. (при отработке конструктора или где-то еще)
killer8080
Цитата (Hetman @ 26.08.2014 - 00:17)
3. При генерации исключения в конструкторе, объект все равно создается!

да ну
class Test
{
public function __construct() {
throw new Exception('error');
}
}


try {
$o = new Test;
} catch (Exception $e) {
echo $e->getMessage();
}

var_dump($o); // Notice: Undefined variable: o in ...
T1grOK
Цитата (Hetman @ 25.08.2014 - 20:17)
Но все равно это не то. Заменяется стандартный способ создания объекта через new, а это не есть красиво.

Тогда вероятней всего стоит выбросить все паттерны проектирования в мусор!

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
bestxp
скорее ТСу совет не извращаться, а просто использовать что-то типа фабрики которая и будет решаьб создавать или нет класс
Hetman
Цитата (killer8080 @ 26.08.2014 - 15:06)
Цитата (Hetman @ 26.08.2014 - 00:17)
3. При генерации исключения в конструкторе, объект все равно создается!

да ну
class Test
{
public function __construct() {
throw new Exception('error');
}
}


try {
$o = new Test;
} catch (Exception $e) {
echo $e->getMessage();
}

var_dump($o); // Notice: Undefined variable: o in ...


Здесь в блок try помещена сама попытка создания объекта, тогда работает.
В случае ошибки отменяется кусок кода в блоке try.
Понял. За ликбез спасибо. )
killer8080
Цитата (Hetman @ 27.08.2014 - 13:39)
Здесь в блок try помещена сама попытка создания объекта, тогда работает.

если исключение не перехватывать, то выкинет Fatal error: Uncaught exception 'Exception', так что в любом случае никакой переменной уже не будет smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.