За последние 24 часа нас посетили 71313 программистов и 1625 роботов. Сейчас ищут 876 программистов ...

Впрыск объекта в объект др. класса

Тема в разделе "PHP для новичков", создана пользователем Neka, 24 июн 2011.

  1. Neka

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

    С нами с:
    16 янв 2010
    Сообщения:
    188
    Симпатии:
    0
    Приветствую!
    Сформулировал заголовок, как смог, но объясню:
    Например есть объект класса Logger() ($logger), и объект класса DataBase ($db), это так скажем объекты, которые могу понадобиться в любой момент времени в любом месте, но не копии их, а именно они сами (т.е. ссылки на них). В глобальной области видимости с этим проблем нет. Но если нам понадобится этот объект в теле класса (точнее в теле метода класса)?

    Я встречал вариант - дополнительный класс Context, который содержит в себе все необходимые объекты (т.е. ссылки конечно, на эти объекты), и впрыскивается в объект класса, в котором необходимы эти классы, например
    PHP:
    1. <?php $user=new User($context);
    Так же есть вариант использования синглнтона, который гарантирует уникальность и единственность объекта. Т.е. в конструкторе класса, где нам нужна ссылка делаем так:
    PHP:
    1. <?php $logger = Logger::getInstance;
    Но вспомним, что у нас есть массив $GLOBALS, где лежит уже нужная нам ссылка на объект, например $logger. Т.е. как будет вести сея такая конструкция в теле класса, где нам нужны ссылки
    PHP:
    1. <?php
    2. class Example() {
    3.     public $logger = $GLOBALS['logger'];
    4. }
    Типа так ну или вариации этого никак не проработать, дабы решить проблему впрыска нужных объектов? Какие в этом случае подводные камни, почему я не встречал такого способа ниразу?
     
  2. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    обычно пользуюсь синглтоном
     
  3. Neka

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

    С нами с:
    16 янв 2010
    Сообщения:
    188
    Симпатии:
    0
    Ок, я тоже.
    Но меня интересует именно передача ссылки на объект с помощью массива $GLOBALS. Мнения, подводные камни, и т.д.
     
  4. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    можно. подводных камней не замечено
     
  5. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Скандалы, интриги, расследования. )
     
  6. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    1. Забудьте о соществовании GLOBALS. Если решили изучать ООП - это будет ваш первый шаг.
    2. Синглтон хорош на первых порах, пока вникаете, потом от него одни проблемы, ибо повышает сцепку между классами.
    3. "Context" - это абстрактная фабрика, хороший следующий шаг после синглтонов, причем объект фабрики можно получать через синглтон. Хотя вариант инжекции тоже хорош
    4. Следующим шагом мог бы быть DI (dependency injection), особо если есть фреймворк который это умеет
    а теперь, если (есть реальное желание научится делать хорошо и правильно потратив на это кучу времени), то
    - гуглим про паттерны проектирования
    - идем на другой форум
    иначе, если (хочется быстро что-то присрать и говнокодить дальше), то
    - пихаем все в глобалс и вообще думать много - вредно, пилить нужно
     
  7. Neka

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

    С нами с:
    16 янв 2010
    Сообщения:
    188
    Симпатии:
    0
    MiksIr
    1. Этот пост - первое место, где я использовал переменную $GLOBALS;
    2. Сцепка между классами - извините, не понял. Если можно, поподробнее;
    3. В чем плюсы и минусы этой "абстрактной фабрики"?
    4. По поводу шаблонов проектирования: что вы думаете о книгах Мэтт Зандстра - "РНР. Объекты, шаблоны и методики программирования" и Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес - "Приемы объектно-ориентированного проектирования. Паттерны проектирования". А так же что за "банда четырех"? Уж очень начитался об их публикации.
     
  8. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Хочется потроллить? Развести говносрач? Спроси на форумах
    и добавь
     
  9. dots_rei

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

    С нами с:
    7 авг 2009
    Сообщения:
    193
    Симпатии:
    0
    прочитайте указанные вами книги (лучше обе), куча вопросов отпадет.
     
  10. Neka

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

    С нами с:
    16 янв 2010
    Сообщения:
    188
    Симпатии:
    0
    iliavlad, что за привычка судить людей по себе? Не нравится вопрос - не отвечайте. Все категорически просто. Ваш пост с легкостью можно определить как "говносрач", т.к. он не несет никакой смысловой нагрузки в себе.

    dots_rei, с удовольствием! Но они еще идти будут 2 недели, а вопросов масса.

    Я задал вопросы относительно ответа другого человека. Т.е. хочу услышать его точку зрения на эти проблемы (или не проблемы). Ну или точки зрения других людей, что в этом плохого?
     
  11. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Гамма - это классика, ее читать. Зандстра - не знаю, не читал, но хуже не будет.
    Фаулер - одна из ключевых фигур, хоть все его книги читать... ну или те, что есть под рукой и пойдут полегче.
    Вот еще полезная книга http://www.rsdn.ru/res/book/web/php_5_prof.xml ибо там примеры на PHP сразу, тогда как в других книгах скорее будет С++ и Java.
    Вообще тут есть темы про литературу - поищи. Пока идут книги, можно просто погуглить на "паттерны проектирования" - много информации. Абстрактная фабрика не очень удобна тем, что на больших проектах очень боьшая, громоздская, ну и при переносе классов в другой проект, например, придется таскать весь класс фабрики. Сцепка, связность - тоже базисные понятия ООП (я, кстати, оговорился, важна слабая связность, сцепка - это немного другое) - т.е. классы должны как меньше знать о реализации других классов и вообще их наличии.
     
  12. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    MiksIr

    Ты все правильно сказал, только немного термины переставил местами)

    Нужна высокая связность, но низкая сцепленность. По крайней мере так у Макконнелла
     
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Все еще хуже ;) Связанность - это насколько классы зависят друг от друга, т.е. хорошо когда низкая. И зацепление оно же связность - класс должен выполнять то, и только то, для чего он создан - высокое(сильное) зацепление - когда у каждого класса строго определенный функционал, который он выполняет, тогда как низкое зацепление - это классы перегруженные функционалом, который можно вполне разделить на несколько классов.
    Сложности перевода, так что да, запутался сам. Coupling и сohesion - устоявшиеся английские термины.
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    "Говнокод!" - будет первый комментарий к твоему коду, когда ты его куда-то выложишь ;D