Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Разрушить класс в конструторе


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

Пример:
Код


$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 вместо объекта?

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

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

Автор: sTa1kEr 3.7.2008, 10:28
Цитата(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 http://forum.vingrad.ru/index.php?showtopic=216818&view=findpost&p=1555459.

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

Автор: CyClon 7.7.2008, 10:39
Шаблон фабрики классов посмотри

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)