Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разрушить класс в конструторе 
:(
    Опции темы
Smak
Дата 3.7.2008, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.6.2005

Репутация: нет
Всего: 1



Есть класс, которые работает в двух режимах, режим работы устанавливается через конструктор класса.
Нужно не создавать объект если передан неизвестный режим.

Пример:
Код


$megaclass = new MegaClass('one'); // Создаётся экземплятор
$megaclass = new MegaClass('two'); // Создаётся экземплятор

$megaclass = new MegaClass('other'); // Возвращает false

class MegaClass
{
     private $type;    

    function __construct($type)
   {
        switch($type)
        {
              case 'one': $this->type = 'one'; break;
              case 'two': $this->type = 'two'; break;
              default: /* разрушаем класс */ break;
        }
   }
}



Собственно как вернуть из конструктора false вместо объекта?

Это сообщение отредактировал(а) Smak - 3.7.2008, 07:58
PM MAIL WWW ICQ   Вверх
krundetz
Дата 3.7.2008, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Собственно в конструкторе это сделать нельзя но можно сделать статический метод который в зависомости от ситуации будет создавать обект либо возвращать false. Конструктор будет в этом случае приватным. Тоесть примерно так.
Код

class NameClass
{
     private function __construct()
     {
     }
     public static function initClass($param)
     {
           if($param)
           {
                  return new NameClass();
           }
           else
           {
                  return false;
           }
     }
}


Это сообщение отредактировал(а) krundetz - 3.7.2008, 09:01


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
sTa1kEr
Дата 3.7.2008, 10:28 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Smak @  3.7.2008,  08:39 Найти цитируемый пост)
Собственно как вернуть из конструктора false вместо объекта?

Естественно, false в конструкторе вернуть нельзя, но это и не нужно. То что в конструктор были переданы не верные данные - исключительная ситуация, и соответственно, нужно бросить экзепшен. Пример:
Код

class ArgumentNullException extends Exception
{
    public function __construct($arg) { parent::__construct('Argument '.$arg.' is null', 0); }
}

class Some
{
    public function __construct($notNull)
    {
        if ($notNull === null)
        {
            throw new ArgumentNullException('$notNull');
        }
    }
}

$obj = null;

try
{
    $obj = new Some(null);
}
catch (ArgumentNullException $ex)
{
    echo $ex->getMessage()."\n"; // Argument $notNull is null
}

var_dump($obj); // NULL


Ситуации когда нужно именно бросать экзепшены, а не возращать "фолзы", имхо, хорошо описал LSD тут.

Это сообщение отредактировал(а) sTa1kEr - 3.7.2008, 10:29
PM MAIL   Вверх
nerezus
Дата 6.7.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Верный вариант - м исключением. Это не то, что хочет топикстартер, но то, что он хочет - неправильно.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
CyClon
Дата 7.7.2008, 10:39 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Шаблон фабрики классов посмотри


--------------------
user posted image
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0783 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.