Помогите разобраться с ООП
Помогите разобраться с технологией объектного подхода в PHP
В литературе, что мне попадалось написано почти одно и тоже.
"ООП" — общепринятое в масс-медиа наименование Организации Освобождения Палестины…
И призыв с ней "разобраться" звучит весьма двусмысленно
Сейчас набегут желающие...
(прошу отнестись к посту как к вечерне-праздничному флуду… можно и потереть ф топку!)
Чем отличается программа написанная на только на функциях от программы написанной с использованием классов?
Класс это Аля много мерный массив (только может содержать кучу видов объектов + переопределение класса классом)… и пример функция в старом виде без использщования классов, например возращает только 1 значение, а при использовании класса может передавать целый контейнер который содержит класс, причем созхдаваемый динамически, а не предопределнный как ранее
Хм… по поводу учебника по СИ что-то не возникало надо глянуть будет.
Мой язык до этого был Pascal мы не использовали объектно-ориентированный подход.
Просто из-за этого у меня не складываются отношения и с JavaScript.
Не пониманию в чем смысл этого многомерного массива с объектами…
Согласен там небыло классов максимум — многомерные массивы + паскаль имеет деление на функции и профедуры а в си все функции… тоесть если в си пустая функция без возврата значения (по опрделению паскаля профедура) может стать при определенных условиях фукцией (с возвращаемым значением т.е. не пустой изначально дав ей тип void станет int) в паскале такое ограничение меня отталкнуло и в итоге я ушел в сторону си отбросив паскаль.
Синтаксис JavaScript очень схож с синтаксисом Си. PHP хоть и писался изначально на Си но потом части его были написаны на дргуих языках включая паскаль (в паскале с классами и по сей день много чего не але) в итоге хоть и имеет много схожего с Си но очень далек от него по функционалу и из-за сферы применения и из-за набора библиотек.
Еще момент в классе определения могут оказаться и сами функции в которых они определяются… — вот в этом и есть очень сильное отличие от многомерного массива + массив не може хранить в себе разнотипные данные и массив не возможно передать с набором значений нужно указать изначально внешний указатель на массив и из функции уже работать с данными через указатель а не напряму как с классами например. ну это основные отличия пожалуй…
Но после паскаля, всё никак не могу перейти на объектно-ориентированную модель программирования
вижу не похож)))
Более логичный и гибкий код, который потом намного проще расширятьЧто дает использование классов?
Например мы пишем игру, в которой есть два типа монстров, легкие (Lite) и тяжелые (Heavy). Они отличаются, скажем, уровнем брони. То есть удар игрока по легкому монстру снимает с него 10 жизней, а по тяжелому — всего 2. И вот нам нужно написать функцию, которая эти удары обрабатывает:
function hitMonster($monster_type, $monster_health){ if ($moster_type=='Lite') { $monster_health -= 10; } if ($moster_type=='Heavy') { $monster_health -= 2; } return $monster_health; }
Теперь посмотрим как это решается с помощью ООП. Для начала создаем класс монстра:
class Monster{ private $health; public function __construct() { } public function hit(){ } public function getHealth() { return $this->health; } }
class LiteMonster extends Monster{ public function __construct() { $this->health = 100; } public function hit(){ $this->health = $this->health - 10; } }
class HeavyMonster extends Monster{ public function __construct() { $this->health = 150; } public function hit(){ $this->health = $this->health - 2; } }
$lite = new LiteMonster(); $heavy = new HeavyMonster(); //ударим легкого $lite->hit(); echo $lite->getHealth(); //выведет "90"
— чтобы добавить монстра, просто создаем еще один класс;
— каждый монстр описан в собственном классе (в отдельном файле) и никак не смешивается с остальными;
— если надо добавить какую-то функцию всем монстрам сразу — правим родительский класс Monster;
В этом и состоит главное преимущество ООП — удобное разделение кода и его расширяемость.
Например, в ближайших релизах InstantCMS мы будем переводить компоненты на классы. И это даст одно важное преимущество: чтобы что-то изменить в компоненте, достаточно будет создать свой класс, расширяющий базовый компонент, и переопределить в нем только нужный метод. Тогда при обновлении движка мы не будем терять наших изменений.
Надеюсь прояснил хоть что-то :)
Я буду писать простым языком))) Допустим тут просили сделать мини игры.
Задача сделать ядро(приложение) для гибкого добавления и использования игр.
Что мы делаем в самом начале:
1. определяем самый главный класс InstantGames. Сразу вопрос читал про конструктор. при написании такова имени класса не возникнет конфликтов? Я так понял плагины построены на принцыпе конструктора?
2. дальше мы думаем какие свойства будут обладать наш класс
— он будет добавлять мини игры
— создавать игру
— подключаться к игру
— запрашивать список игр
— запрашивать рейтинг по игре
— запрашивать рейтинг по игроку.
так я понимаю что рейтинг это будет еще один класс?
Как правило выстраивать иерархию?
Много ли может быть вложений классов?
Как выстраивать логику при написании проектана классах?
В инстанте как я понимаю самый главный класс cmsCore?
могу только посоветовать почитать вот эту книгу, в сети можно найти PDF