Помогите разобраться с ООП

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО

Помогите разобраться с технологией объектного подхода в PHP

#1 1 мая 2011 в 18:21
Добрый вечер помогите разобраться с классами и объектами. Когда писал скрипты использовал метод аналогии, но пришло время переосмыслить и понять технологию работы с классами. Пробывал разобраться www.php.su/learnphp/phpoo/ используя это и само систему.
В литературе, что мне попадалось написано почти одно и тоже.
#2 1 мая 2011 в 19:30
Наименование темы очень развеселило:

"ООП" — общепринятое в масс-медиа наименование Организации Освобождения Палестины… v
И призыв с ней "разобраться" звучит весьма двусмысленно rofl
Сейчас набегут желающие...
(прошу отнестись к посту как к вечерне-праздничному флуду… можно и потереть ф топку!)
#3 1 мая 2011 в 21:35
Dimitrius, ты бы задавал более конкретный вопрос что ли…
#4 1 мая 2011 в 22:17
Dimitrius, PHP (Personal Home Page tools) написан на С — думаю и разобраться проще будет почитав учебники по С, а не PHP
#5 1 мая 2011 в 22:18
Что дает использование классов?
Чем отличается программа написанная на только на функциях от программы написанной с использованием классов?
#6 1 мая 2011 в 22:25
Dimitrius, Причем ту только фунции и классы =)
Класс это Аля много мерный массив (только может содержать кучу видов объектов + переопределение класса классом)… и пример функция в старом виде без использщования классов, например возращает только 1 значение, а при использовании класса может передавать целый контейнер который содержит класс, причем созхдаваемый динамически, а не предопределнный как ранее
#7 1 мая 2011 в 22:39
Хеее))) я тут обращался к знакомым студентам програмистами)))Они сказали, что сами его не понимают))) а курсачи у них заказаны)
Хм… по поводу учебника по СИ что-то не возникало надо глянуть будет.
Мой язык до этого был Pascal мы не использовали объектно-ориентированный подход.
Просто из-за этого у меня не складываются отношения и с JavaScript.

Не пониманию в чем смысл этого многомерного массива с объектами…
#8 1 мая 2011 в 22:59
Dimitrius, я сам первое образование получил как программист С, Pascal (92-93 годы)
Согласен там небыло классов максимум — многомерные массивы + паскаль имеет деление на функции и профедуры а в си все функции… тоесть если в си пустая функция без возврата значения (по опрделению паскаля профедура) может стать при определенных условиях фукцией (с возвращаемым значением т.е. не пустой изначально дав ей тип void станет int) в паскале такое ограничение меня отталкнуло и в итоге я ушел в сторону си отбросив паскаль.
Синтаксис JavaScript очень схож с синтаксисом Си. PHP хоть и писался изначально на Си но потом части его были написаны на дргуих языках включая паскаль (в паскале с классами и по сей день много чего не але) в итоге хоть и имеет много схожего с Си но очень далек от него по функционалу и из-за сферы применения и из-за набора библиотек.
Еще момент в классе определения могут оказаться и сами функции в которых они определяются… — вот в этом и есть очень сильное отличие от многомерного массива + массив не може хранить в себе разнотипные данные и массив не возможно передать с набором значений нужно указать изначально внешний указатель на массив и из функции уже работать с данными через указатель а не напряму как с классами например. ну это основные отличия пожалуй…
#9 1 мая 2011 в 23:09
Я паскаль изучал на курсах 01-03, после школы ходил. После чего поступил в колледж получил ср. пр. юридическое. Затем высшее тоже гумманитарное. Но вот чувствую, что меня тянет на кодинг. Я от этого удовольствие получаю, есть стремление учится. Для меня это как творчество...
Но после паскаля, всё никак не могу перейти на объектно-ориентированную модель программирования
#10 1 мая 2011 в 23:25
Dimitrius, с си начний😊хотя лучше C# он на данный момент акутальнее и более оплачиваем ))
#11 1 мая 2011 в 23:30
он похож на делфи?

вижу не похож)))
#12 2 мая 2011 в 12:12

Что дает использование классов?

Dimitrius
Более логичный и гибкий код, который потом намного проще расширять

Например мы пишем игру, в которой есть два типа монстров, легкие (Lite) и тяжелые (Heavy). Они отличаются, скажем, уровнем брони. То есть удар игрока по легкому монстру снимает с него 10 жизней, а по тяжелому — всего 2. И вот нам нужно написать функцию, которая эти удары обрабатывает:

  1.  
  2. function hitMonster($monster_type, $monster_health){
  3. if ($moster_type=='Lite') { $monster_health -= 10; }
  4. if ($moster_type=='Heavy') { $monster_health -= 2; }
  5. return $monster_health;
  6. }
  7.  
Получается, что добавляя нового монстра мы должны добавлять новую строчку в эту функцию. В итоге, когда монстров станет много, функция разрастется до безобразия.

Теперь посмотрим как это решается с помощью ООП. Для начала создаем класс монстра:

  1.  
  2. class Monster{
  3. private $health;
  4. public function __construct() { }
  5. public function hit(){ }
  6. public function getHealth() { return $this->health; }
  7. }
  8.  
Далее создаем класс легкого монстра:
  1.  
  2. class LiteMonster extends Monster{
  3. public function __construct() { $this->health = 100; }
  4. public function hit(){ $this->health = $this->health - 10; }
  5. }
  6.  
и тяжелого:

  1.  
  2. class HeavyMonster extends Monster{
  3. public function __construct() { $this->health = 150; }
  4. public function hit(){ $this->health = $this->health - 2; }
  5. }
  6.  
в коде монстры создаются так:

  1.  
  2. $lite = new LiteMonster();
  3. $heavy = new HeavyMonster();
  4. //ударим легкого
  5. $lite->hit();
  6. echo $lite->getHealth(); //выведет "90"
  7.  
что получаем в итоге:

— чтобы добавить монстра, просто создаем еще один класс;
— каждый монстр описан в собственном классе (в отдельном файле) и никак не смешивается с остальными;
— если надо добавить какую-то функцию всем монстрам сразу — правим родительский класс Monster;

В этом и состоит главное преимущество ООП — удобное разделение кода и его расширяемость.

Например, в ближайших релизах InstantCMS мы будем переводить компоненты на классы. И это даст одно важное преимущество: чтобы что-то изменить в компоненте, достаточно будет создать свой класс, расширяющий базовый компонент, и переопределить в нем только нужный метод. Тогда при обновлении движка мы не будем терять наших изменений.

Надеюсь прояснил хоть что-то :)
#13 2 мая 2011 в 13:08
Да)))) происходит переосмысление=)
Я буду писать простым языком))) Допустим тут просили сделать мини игры.
Задача сделать ядро(приложение) для гибкого добавления и использования игр.
Что мы делаем в самом начале:
1. определяем самый главный класс InstantGames. Сразу вопрос читал про конструктор. при написании такова имени класса не возникнет конфликтов? Я так понял плагины построены на принцыпе конструктора?
2. дальше мы думаем какие свойства будут обладать наш класс
— он будет добавлять мини игры
— создавать игру
— подключаться к игру
— запрашивать список игр
— запрашивать рейтинг по игре
— запрашивать рейтинг по игроку.

так я понимаю что рейтинг это будет еще один класс?
Как правило выстраивать иерархию?
Много ли может быть вложений классов?
Как выстраивать логику при написании проектана классах?
В инстанте как я понимаю самый главный класс cmsCore?
#14 4 мая 2011 в 11:14
Эм… темку поднял)
#15 4 мая 2011 в 11:19
вы тут вопросов задали на пару толстых учебников, так что смысла поднимать ее нет :)

могу только посоветовать почитать вот эту книгу, в сети можно найти PDF
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.