Приветствую! Сформулировал заголовок, как смог, но объясню: Например есть объект класса Logger() ($logger), и объект класса DataBase ($db), это так скажем объекты, которые могу понадобиться в любой момент времени в любом месте, но не копии их, а именно они сами (т.е. ссылки на них). В глобальной области видимости с этим проблем нет. Но если нам понадобится этот объект в теле класса (точнее в теле метода класса)? Я встречал вариант - дополнительный класс Context, который содержит в себе все необходимые объекты (т.е. ссылки конечно, на эти объекты), и впрыскивается в объект класса, в котором необходимы эти классы, например PHP: <?php $user=new User($context); Так же есть вариант использования синглнтона, который гарантирует уникальность и единственность объекта. Т.е. в конструкторе класса, где нам нужна ссылка делаем так: PHP: <?php $logger = Logger::getInstance; Но вспомним, что у нас есть массив $GLOBALS, где лежит уже нужная нам ссылка на объект, например $logger. Т.е. как будет вести сея такая конструкция в теле класса, где нам нужны ссылки PHP: <?php class Example() { public $logger = $GLOBALS['logger']; } Типа так ну или вариации этого никак не проработать, дабы решить проблему впрыска нужных объектов? Какие в этом случае подводные камни, почему я не встречал такого способа ниразу?
Ок, я тоже. Но меня интересует именно передача ссылки на объект с помощью массива $GLOBALS. Мнения, подводные камни, и т.д.
1. Забудьте о соществовании GLOBALS. Если решили изучать ООП - это будет ваш первый шаг. 2. Синглтон хорош на первых порах, пока вникаете, потом от него одни проблемы, ибо повышает сцепку между классами. 3. "Context" - это абстрактная фабрика, хороший следующий шаг после синглтонов, причем объект фабрики можно получать через синглтон. Хотя вариант инжекции тоже хорош 4. Следующим шагом мог бы быть DI (dependency injection), особо если есть фреймворк который это умеет а теперь, если (есть реальное желание научится делать хорошо и правильно потратив на это кучу времени), то - гуглим про паттерны проектирования - идем на другой форум иначе, если (хочется быстро что-то присрать и говнокодить дальше), то - пихаем все в глобалс и вообще думать много - вредно, пилить нужно
MiksIr 1. Этот пост - первое место, где я использовал переменную $GLOBALS; 2. Сцепка между классами - извините, не понял. Если можно, поподробнее; 3. В чем плюсы и минусы этой "абстрактной фабрики"? 4. По поводу шаблонов проектирования: что вы думаете о книгах Мэтт Зандстра - "РНР. Объекты, шаблоны и методики программирования" и Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес - "Приемы объектно-ориентированного проектирования. Паттерны проектирования". А так же что за "банда четырех"? Уж очень начитался об их публикации.
iliavlad, что за привычка судить людей по себе? Не нравится вопрос - не отвечайте. Все категорически просто. Ваш пост с легкостью можно определить как "говносрач", т.к. он не несет никакой смысловой нагрузки в себе. dots_rei, с удовольствием! Но они еще идти будут 2 недели, а вопросов масса. Я задал вопросы относительно ответа другого человека. Т.е. хочу услышать его точку зрения на эти проблемы (или не проблемы). Ну или точки зрения других людей, что в этом плохого?
Гамма - это классика, ее читать. Зандстра - не знаю, не читал, но хуже не будет. Фаулер - одна из ключевых фигур, хоть все его книги читать... ну или те, что есть под рукой и пойдут полегче. Вот еще полезная книга http://www.rsdn.ru/res/book/web/php_5_prof.xml ибо там примеры на PHP сразу, тогда как в других книгах скорее будет С++ и Java. Вообще тут есть темы про литературу - поищи. Пока идут книги, можно просто погуглить на "паттерны проектирования" - много информации. Абстрактная фабрика не очень удобна тем, что на больших проектах очень боьшая, громоздская, ну и при переносе классов в другой проект, например, придется таскать весь класс фабрики. Сцепка, связность - тоже базисные понятия ООП (я, кстати, оговорился, важна слабая связность, сцепка - это немного другое) - т.е. классы должны как меньше знать о реализации других классов и вообще их наличии.
MiksIr Ты все правильно сказал, только немного термины переставил местами) Нужна высокая связность, но низкая сцепленность. По крайней мере так у Макконнелла
Все еще хуже Связанность - это насколько классы зависят друг от друга, т.е. хорошо когда низкая. И зацепление оно же связность - класс должен выполнять то, и только то, для чего он создан - высокое(сильное) зацепление - когда у каждого класса строго определенный функционал, который он выполняет, тогда как низкое зацепление - это классы перегруженные функционалом, который можно вполне разделить на несколько классов. Сложности перевода, так что да, запутался сам. Coupling и сohesion - устоявшиеся английские термины.