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
Форумы портала PHP.SU :: Версия для печати :: Правильно ли создавать объекты в классах?
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Правильно ли создавать объекты в классах?

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

1. magvan - 07 Июня, 2014 - 23:32:21 - перейти к сообщению
Здравствуйте!
Программирую на функциях 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.  


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

Это правильная схема взаимодействия объектов?
2. OrmaJever - 07 Июня, 2014 - 23:42:30 - перейти к сообщению
да, почему бы и нет. Я вам больше скажу, в джаве только так и делают Улыбка
3. magvan - 07 Июня, 2014 - 23:48:32 - перейти к сообщению
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 почти полностью адаптирована интерпретация к ООП.
4. EuGen - 08 Июня, 2014 - 13:41:23 - перейти к сообщению
TL;DR - прочесть про DI (Dependency Injection).

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

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

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

 

Powered by ExBB FM 1.0 RC1