За последние 24 часа нас посетили 59084 программиста и 1845 роботов. Сейчас ищут 836 программистов ...

отмена создания объекта

Тема в разделе "PHP для новичков", создана пользователем ShamahN, 23 мар 2008.

  1. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Может кто-нить уже сталкивался. В общем нужно, чтобы при определенных условиях объект не создавался, а переменной которая должна была стать объектом, присваивался 0, допустим
    Вот на примере
    PHP:
    1.  
    2.  
    3. class easy
    4. public $i = 0;
    5. {
    6.  function __construct($i)
    7.  {
    8.   if ($i>1) $this->i=$i; else
    9.   {
    10.     unset ($this); или не знаю что :)
    11.     return 0;
    12.   }
    13.  }
    14. }
    15.  
    16. $a=new easy(); - нужно чтобы $a был 0
    17.  
    Возможно такое?
     
  2. Anonymous

    Anonymous Guest

    ага.

    PHP:
    1. <?
    2. if ($i>1) $a = new easy($i); else $a = null;
     
  3. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Ну друг :) ты совсем сутрировал :) я же образно говоря.. :)
    Вообще, у того класса к которому я хочу прикрутить в конструкте запрос, и вот если он пустой, тогда... :)
    но глупо ведь 2 раза делать запрос :)
     
  4. Anonymous

    Anonymous Guest

    Я ничего не утрировал. Это ООП, обьект не должен принимать решений о собственном создании или несоздании, это дело непосредственно программы.
     
  5. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    как это не должен? а при невозможности его создания? :) не верю :)
     
  6. Anonymous

    Anonymous Guest

    Как мне тут хорошо подсказывают:
    Решение о НЕОБХОДИМОСТИ создания обьекта принимается ИЗВНЕ обьекта. Не внутри.
     
  7. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    :):):):):):):):) понятно.. :) спасибо что просветили
     
  8. dAllonE

    dAllonE Guest

     
  9. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.

    так и сделал уже.. Просто мне казалось что можно сделать немного прозрачнее, но раз нет, так нет
     
  10. Clone

    Clone Guest

    Да, исключение или генерация ошибки это, имхо, самый оптимальный вариант.
     
  11. Anonymous

    Anonymous Guest

    Имхо, оптимальный вариант не создавать обьект )
     
  12. Clone

    Clone Guest

    А если условие проверки поменяется? Искать его во всех файлах и перебивать?
     
  13. dAllonE

    dAllonE Guest

    Вы оба правы только в разных случаях... )
     
  14. Anonymous

    Anonymous Guest

    Упаси бог. Во первых, обьекты должны создаваться в одном месте.
    Во вторых, я не сказал, что это (нужно или нет создавать) не может знать другой обьект.
     
  15. Anonymous

    Anonymous Guest

  16. Clone

    Clone Guest

    Как это в одном месте? Если мне, например, в некоторых модулях грубо говоря требуется доступ к кешу, а в некоторых - нет, мне что, в основном файле по-любому создавать объект кеша?
    Да и с какой стати один объект должен лезть в дела другого, тем более в такие интимные вопросы, как решение объекта создаваться или нет. А приведённый код вообще нагло нарушает инкапсуляцию и раскрывает внутреннее устройство конструктора. Да, можно написать метод-интерфейс, который будет проверять возможность создания объекта, это будет лучше ломовой проверки условия, что-то среднее между 1 и 2 пунктом. А по ссылке я не нашёл решение обсуждаемой проблемы. Если я слеп, плиз, зацитируй место, которое отвечает на вопрос "как реализовать возможность объекту решать создавать себя или нет?"...
     
  17. Anonymous

    Anonymous Guest

    Нет такого вопроса.
    Это тоже по ссылке есть. Обьект создается лишь по первому требованию.
     
  18. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    ShamahN

    паттерн фабрика
    PHP:
    1. <?
    2. class easy {
    3.    static function factory($i = 0) {
    4.       return $i>1 ? new self($i) : 0;
    5.    }
    6. }
    7.  
    8.  
    9. $a = easy::factory(); // $a == 0
     
  19. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    1. почитай про патерны. в частности про сиглетоны и фабрики. когда просвятишься проблема отпадет сама собой, а объекты будут создаваться в нужные моменты и в любм месте, а файлы который нужно включать что б классы заработали так же будут включаться в нужных местах, а ты даже про эо думать не будешь.
     
  20. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    $cache = MyCache::GetInstance();

    и не думать о том какой файл включить, создан объект или нет. Ты не должен про это думать. Про это должны думать соответствующие компонентц системы.

    А ты должен творить...

    p.s. правда вот что получиться дело уже твое...
     
  21. Clone

    Clone Guest

    Открыл Америку:))) Я про это и говорил, что код, который Олег приводит:
    Как раз и заставляет думать о внутреннем устройстве класса. И что если мне в нескольких местах потребуется создать экземпляр easy или что он там вернёт вместо себя, то согласно этому коду, я должен его(код) везде(при каждом создании экземпляра) вставлять.
     
  22. Clone

    Clone Guest

    Вот к коду
    PHP:
    1. <?php
    2. if (easy::isCreatable()) $a = new easy($i); else {/*что-то там для обработки нестандартной ситуации*/}
    У меня бы вопросов не возникло. Казалось бы деталь, но весьма и весьма существенная.
     
  23. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Clone

    ну грамотное проектировние вообще сложная штука...

    но ИМХО объект не должен знать может он создаться или нет. Это нарушает само понятие объекта, т.к. если он не создан, то его и нету вовсе как и его методов (статика не в счет), а если создан, то какое дело может он создаваться или нет, т.к. он уже есть.
     
  24. Clone

    Clone Guest

    Всё равно нужно хоть как-то использовать защитное программирование. Лучше скомбинировать 2 варианта, возможно в конструкторе повторно вызывать self::isCreatable(), если сильно критична стабильность.. Правда зачем нам куцый объект без большинства своих возможностей? Генерить исключение и идти дальше\заканчивать выполнение программы..
     
  25. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    мож дело не в ООП, а в голове и извращенном восприятии реальности?