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

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


// Класс генерирует страницу
class GeneratesPage{
...
function __construct(){
$a = new GeneratesTable();
}
}


// Класс генерирует таблицу
class GeneratesTable{
...
function __construct(){
$a = new GeneratesButton();
}
}



// Класс генерирует кнопку
class GeneratesButton{
...
function __construct(){
...
}
}


$b = new GeneratesPage();


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

Это правильная схема взаимодействия объектов?
Arh
Обычно взаимодействуют между собой методы классов, а не сами классы.
Конечно и классы могут взаимодействовать, их можно наследовать и всё такое, но в большинстве случаев это костыли.

Я бы посоветовал сначала разобраться в работе классов, как и что там делается, а потом уже думать о схемах.
Просто сейчас это выглядит как ООП ради ООП, это часто встречается.
Вместо того чтобы создать html страницу с таблицей и кнопкой, вы начинаете городить городу (я понимаю что это был пример)

Для начала.
Разбейте свои функции по тематическим классам, например, функции которые что то делают с текстом положите в класс text, функции которые что то делают с датой, положите в класс dates.
Сделайте автозагрузку классов.
Как понадобиться что то сделать с текстом, например очистить его от чего либо, от матерных слов допустим, вы вызываете класс text и его метод clear (метод clear это ваша функция которая будет заниматься очисткой)
$content = $text->clear($content);

или
загрузка текста из файла
$content = $text->load('files.txt');


То есть сделайте библиотеку функций с помощью классов
$dates->work();//вывод всех рабочих дней (без выходных и праздников)


Поработайте с этим, почитайте про статические свойства и методы
dates::work();
dates::$var;


Начните использовать PDO, наследуйте класс PDO чтобы не вводить постоянно данные для подключения (google: PDO и шаблон singleton)

Потом вы постепенно придете к $this
вам захочется сделать так
echo $text->load('file.txt')->clear();


В общем я к чему это всё.
Когда учишься чему то, не понимая зачем это нужно, и учёба даётся с трудом и в последствии начинаешь использовать разные фишки не к месту. Но с чего то надо начать, начните с того что классы, это афигенно удобный сборник функций с автозагрузкой =)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
magvan
Arh, Вы описали основы, они мне известный.
Я предложил ситуацию и предложил свое решение, а как бы Вы решили такую задачу?
S.Chushkin
Есть два варианта: классически и конкретный. По классике Вы правильно написали - всё в мире есть объекты. Даже отдельная буква в строке тоже объект.
Но PHP не объектный язык. Объекты в нём носят вспомогательные функции - это надстройка для высокоуровневой абстрации. В данном случае, объект "страница" это нормально и в некоторых случаях объект "таблица" тоже нормально (именно в некоторых!). А вот абстрация объект-кнопка это уже излишне и в 99,9999% случаев не применяется. Т.е. в ПХП применяется смешанный код - на высоком уровне пишутся классы (прототипы объектов), а на низком - простой код ПХП.
п.с. И основная причина проста - если в PHP всё писать на ООП, то код будет ползать медленнее черепахи.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
magvan
Для себя я выделил несколько плюсов ООП, это инкапсуляция и уменьшение повторяющегося кода.
Инкапсуляция - если я создал объект, знаю что получу нужный мне результат и даже не задумываюсь как это происходит. С функциями так красиво (для меня это красиво) не получится, нет модификаторов доступа, функция может возвращать только один ответ, а что то мудрить из нескольких функций, думаю будет не красиво.
Вторая фишка из-за которой мне кажется что ООП нужная вещь, это уменьшение повторяющегося кода. Подключил автозагрузку классов и в любом месте создавай объект который нужен.

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


// Класс генерирует страницу
class GeneratesPage{
...
function __construct(){
$a = new GeneratesTable();
}
}


// Класс генерирует таблицу
class GeneratesTable{
...
function __construct(){

$sql = mysql_query (" запрос в БД ");
while($row = mysql_fetch_assoc($sql)){
$button = new GeneratesButton('name','data-id','.$row['id'].');
$output_tr = $output_td.'<tr><td>'.$button->getButton().'</td></tr>';
}
$output_table = '<table>'.$output_tr.'</table>';

}
}



// Класс генерирует кнопку
class GeneratesButton{
privat $button;
public function __construct($name ,$data_name, $data_value){
$this->button = '<div class="button" '.$data_name.'="'.$data_value.'">'.$name.'</div>';
}
public function getButton(){
return $this->button;
}
}


$b = new GeneratesPage();


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

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

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.