Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Правильно ли создавать объекты в классах?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
magvan
Отправлено: 07 Июня, 2014 - 23:32:21
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Здравствуйте!
Программирую на функциях PHP пару лет. Решил попробовать ООП.
Прочитал основы ООП в двух книгах. Как токовых примеров не видел. Посмотрел фремворк kohana, тольку правда не дало... не понял нефига( есть один вопрос к знатокам ООП, буду очень благодарен за ответ.

Например: Есть 3 класса, с помощью них создается страница html, в которой есть таблица, а в таблице есть кнопка

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. // Класс генерирует страницу
  3. class GeneratesPage{
  4.    ...
  5.    function __construct(){
  6.       $a = new GeneratesTable();
  7.    }
  8. }
  9.  
  10. // Класс генерирует таблицу
  11. class GeneratesTable{
  12.    ...
  13.    function __construct(){
  14.       $a = new GeneratesButton();
  15.    }
  16. }
  17.  
  18.  
  19. // Класс генерирует кнопку
  20. class GeneratesButton{
  21.    ...
  22.    function __construct(){
  23.       ...
  24.    }
  25. }
  26.  
  27. $b = new GeneratesPage();
  28.  


То есть, есть объект "страница" в ней объект "таблица", а в ней объект "кнопка"

Это правильная схема взаимодействия объектов?
 
 Top
OrmaJever Модератор
Отправлено: 07 Июня, 2014 - 23:42:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




да, почему бы и нет. Я вам больше скажу, в джаве только так и делают Улыбка


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
magvan
Отправлено: 07 Июня, 2014 - 23:48:32
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




OrmaJever, спасибо )

Для себя я выделил несколько плюсов ООП, это инкапсуляция и уменьшение повторяющегося кода.
Инкапсуляция - если я создал объект, знаю что получу нужный мне результат и даже не задумываюсь как это происходит. С функциями так красиво (для меня это красиво) не получится, нет модификаторов доступа, функция может возвращать только один ответ, а что то мудрить из нескольких функций, думаю будет не красиво.
Вторая фишка из-за которой мне кажется что ООП нужная вещь, это уменьшение повторяющегося кода. Подключил автозагрузку классов и в любом месте создавай объект который нужен.

Переделаю немного мой первый код. Допустим эта кнопка не один раз используется, а много. На всем сайте есть разные формы, кнопки с каким то функционалом. Предположим что на сайте 30 кнопок.


CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3. // Класс генерирует страницу
  4. class GeneratesPage{
  5.    ...
  6.    function __construct(){
  7.       $a = new GeneratesTable();
  8.    }
  9. }
  10.  
  11. // Класс генерирует таблицу
  12. class GeneratesTable{
  13.    ...
  14.    function __construct(){
  15.      
  16.       $sql = mysql_query (" запрос в БД ");
  17.       while($row = mysql_fetch_assoc($sql)){
  18.          $button = new GeneratesButton('name','data-id','.$row['id'].');
  19.          $output_tr = $output_td.'<tr><td>'.$button->getButton().'</td></tr>';
  20.       }
  21.       $output_table = '<table>'.$output_tr.'</table>';
  22.      
  23.    }
  24. }
  25.  
  26.  
  27. // Класс генерирует кнопку
  28. class GeneratesButton{
  29.    privat $button;
  30.    public function __construct($name ,$data_name, $data_value){
  31.       $this->button = '<div class="button" '.$data_name.'="'.$data_value.'">'.$name.'</div>';
  32.    }
  33.    public function getButton(){
  34.       return $this->button;
  35.    }
  36. }
  37.  
  38. $b = new GeneratesPage();
  39.  
  40.  


Класс GeneratesButton прописывается всего один раз, может быть это и не удачный пример сокращения повторяющегося кода, но все же он это делает. А если мне будет нужна другая кнопка с дополнительными параметрами, я наследую от этого класса новый и добавлю дополнительный функционал.

У меня была мысль что PHP с ООП не может быть быстрым по сравнению с С++, так как нет компиляции в PHP, а каждый раз при загрузки скрипта идет интерпретация, а интерпретировать объекты ресурсоемкая "функция" (Я это не проверял! это предположение ). Думал что php5 почти полностью адаптирована интерпретация к ООП.

(Отредактировано автором: 08 Июня, 2014 - 08:08:10)

 
 Top
EuGen Администратор
Отправлено: 08 Июня, 2014 - 13:41:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




TL;DR - прочесть про DI (Dependency Injection).

OrmaJever пишет:
да, почему бы и нет.

Нет, потому что это - часть "S.T.U.P.I.D." - кода.
- Tight coupling (Жёсткая связка)
- Untestability (Невозможность тестирования)
- Duplication (Дублирование)

Общеизвестный пример. Если для того, чтобы построить дом, нам нужна дверь, мы не будем её создавать, а просто возьмём готовую. Так и здесь - если для исполнения метода нужен объект, не следует его создавать, следует его передавать.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB