Может кто-нить уже сталкивался. В общем нужно, чтобы при определенных условиях объект не создавался, а переменной которая должна была стать объектом, присваивался 0, допустим Вот на примере PHP: class easy public $i = 0; { function __construct($i) { if ($i>1) $this->i=$i; else { unset ($this); или не знаю что :) return 0; } } } $a=new easy(); - нужно чтобы $a был 0 Возможно такое?
Ну друг ты совсем сутрировал я же образно говоря.. Вообще, у того класса к которому я хочу прикрутить в конструкте запрос, и вот если он пустой, тогда... но глупо ведь 2 раза делать запрос
Я ничего не утрировал. Это ООП, обьект не должен принимать решений о собственном создании или несоздании, это дело непосредственно программы.
Как мне тут хорошо подсказывают: Решение о НЕОБХОДИМОСТИ создания обьекта принимается ИЗВНЕ обьекта. Не внутри.
Упаси бог. Во первых, обьекты должны создаваться в одном месте. Во вторых, я не сказал, что это (нужно или нет создавать) не может знать другой обьект.
http://wiki.agiledev.ru/doku.php?id=ooa ... injection#формы_инверсии_зависимостей Это на "почитать". Особенно читать про ServiceLocator
Как это в одном месте? Если мне, например, в некоторых модулях грубо говоря требуется доступ к кешу, а в некоторых - нет, мне что, в основном файле по-любому создавать объект кеша? Да и с какой стати один объект должен лезть в дела другого, тем более в такие интимные вопросы, как решение объекта создаваться или нет. А приведённый код вообще нагло нарушает инкапсуляцию и раскрывает внутреннее устройство конструктора. Да, можно написать метод-интерфейс, который будет проверять возможность создания объекта, это будет лучше ломовой проверки условия, что-то среднее между 1 и 2 пунктом. А по ссылке я не нашёл решение обсуждаемой проблемы. Если я слеп, плиз, зацитируй место, которое отвечает на вопрос "как реализовать возможность объекту решать создавать себя или нет?"...
ShamahN паттерн фабрика PHP: <? class easy { static function factory($i = 0) { return $i>1 ? new self($i) : 0; } } $a = easy::factory(); // $a == 0
1. почитай про патерны. в частности про сиглетоны и фабрики. когда просвятишься проблема отпадет сама собой, а объекты будут создаваться в нужные моменты и в любм месте, а файлы который нужно включать что б классы заработали так же будут включаться в нужных местах, а ты даже про эо думать не будешь.
$cache = MyCache::GetInstance(); и не думать о том какой файл включить, создан объект или нет. Ты не должен про это думать. Про это должны думать соответствующие компонентц системы. А ты должен творить... p.s. правда вот что получиться дело уже твое...
Открыл Америку)) Я про это и говорил, что код, который Олег приводит: Как раз и заставляет думать о внутреннем устройстве класса. И что если мне в нескольких местах потребуется создать экземпляр easy или что он там вернёт вместо себя, то согласно этому коду, я должен его(код) везде(при каждом создании экземпляра) вставлять.
Вот к коду PHP: <?php if (easy::isCreatable()) $a = new easy($i); else {/*что-то там для обработки нестандартной ситуации*/} У меня бы вопросов не возникло. Казалось бы деталь, но весьма и весьма существенная.
Clone ну грамотное проектировние вообще сложная штука... но ИМХО объект не должен знать может он создаться или нет. Это нарушает само понятие объекта, т.к. если он не создан, то его и нету вовсе как и его методов (статика не в счет), а если создан, то какое дело может он создаваться или нет, т.к. он уже есть.
Всё равно нужно хоть как-то использовать защитное программирование. Лучше скомбинировать 2 варианта, возможно в конструкторе повторно вызывать self::isCreatable(), если сильно критична стабильность.. Правда зачем нам куцый объект без большинства своих возможностей? Генерить исключение и идти дальше\заканчивать выполнение программы..