ООП в php - объекты и классы

 

Доброго времени суток дорогой читатель Улыбаюсь Сегодня я поговорю с Вами о том, что такое объектно — ориентированное программирование в php, а именно затронем тему объектов и классов. Мне сложно говорить об этом, так как я сам только начал познавать это направление и мои слова могут быть не верными. Поэтому данная тема из области «Как я понял», а не «Повторяй за мной!» Улыбаюсь Исходя из этого, читаем данную заметку, и если я не прав  —  поправляем. А если я прав, то желаем удачи Улыбаюсь

 

Первым делом хотелось бы сказать следующее. Данные заметки (я надеюсь их будет много) было бы логичнее размещать в рубрике «Уроки по php», но так как данный материал, больше из области «Я так думаю», нежели «Я это точно знаю», я помещаю его в новую рубрику «Я учусь»

Ладно, давайте приступим.

Что такое объекты и классы

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

Естественно все то, что я только что написал, не ответит Вам на вопрос, что же такое классы и объекты. Именно поэтому нужен простой и до боли знакомый пример.

Я очень долго думал, на каком примере Вам показать, что же такое классы и объекты. Была мыслишка повторить все то, что я слышал от автора курсов по самообучению Си. Он пояснял все на примере братьев наших меньших, от чего у меня шарики за ролики заехали.

Хотя сейчас, после некоторого времени работы с классами, пример с животными мне кажется вполне логичный. Но, как новичку, подобный пример мне не понравился.

В общем я решил показать Вам класс кружки. Да, да... Обычной кружки, в которую мы каждое утро наводим чай или кофе. В общем то это и будет делать наш класс, наводить чай или кофе Улыбаюсь

Для начало давайте поговорим из чего состоит класс. Класс состоит и двух вещей:

  1. Свойства  —  эта такая некая переменная, которая видна в области всего класса. Точнее в области созданного объекта.
  2. Метод  —  эта функция внутри класса (объекта)

Давайте создадим наш класс, и объявим в нем свойства:

class glass
{
    var $drink = '';// кофе или чай
    var $water = FALSE;// вода (TRUE вода налита; FALSE вода не налита)
    var $sugar = FALSE;// сахар (TRUE положили сахар; FALSE не положили сахар)
}

Класс объявляется ключевым словом class, после чего идет имя класса. Я назвал класс glass, что в переводе стакан (если верить гугл транслейт)

В теле класса я создал три свойства:

  1. drink  —  в данное свойства мы будим помещать ингредиент (чай или кофе)
  2. water  —  данное свойство будет вмещать в себя воду. Если точнее то наличие воды или ее отсутствие
  3. sugar  —  свойство содержащие информацию о наличие (или же отсутствие) сахара в кружке.

Теперь давайте создадим методы класса. Методов будет четыре. Нам понадобятся такие действия как:

  1. Положить чай или кофе в кружку
  2. Положить сахар
  3. Налить воды
  4. Помешать содержимое кружки
class glass
{
    var $drink = '';// кофе или чай
    var $water = FALSE;// вода (TRUE вода налита; FALSE вода не налита)
    var $sugar = FALSE;// сахар (TRUE положили сахар; FALSE не положили сахар)

    // положить кофе или чай.. ну или еще что-нить =)
    function set_drink($name)
    {
        $this->drink = $name;
    }
    
    // налить воды
    function set_water()
    {
        $this->water = TRUE;
    }
    
    // положить сахар
    function set_sugar()
    {
        $this->sugar = TRUE;
    }
    
    // мешать содержимое кружки ложкой
    function interfere_with()
    {
        if (empty($this->drink) AND $this->water == FALSE AND $this->sugar == FALSE)
            return "Дзынь-дзынь... кружка пуста, и я не знаю какого результата Вы ждете =(";
       
        if (!empty($this->drink) AND $this->water == FALSE AND $this->sugar == FALSE)
            return "Странный скрежет... К сожалению результата нет =(";

         if (!empty($this->drink) AND $this->water == TRUE AND $this->sugar == FALSE)
            return "Дзынь-дзынь... Ура! Вы получили НЕ сладкий ".$this->drink;   
    
        if (!empty($this->drink) AND $this->water == TRUE AND $this->sugar == TRUE)
            return "Дзынь-дзынь... Ура! Вы получили сладкий ".$this->drink;

        if (empty($this->drink) AND $this->water == TRUE AND $this->sugar == TRUE)
            return "Дзынь-дзынь... Ура! Вы получили cладкую воду";
        
        if (empty($this->drink) AND $this->water == FALSE AND $this->sugar == TRUE)
            return "Странный скрежет... К сожалению результата нет =(";
            
        if (empty($this->drink) AND $this->water == TRUE AND $this->sugar == FALSE)
            return "Дзынь-дзынь... В кружке просто вода";            
            
        if (!empty($this->drink) AND $this->water == FALSE AND $this->sugar == TRUE)
            return "Странный скрежет... К сожалению результата нет =(";
    }
}

$glass = new glass();

Объект создается через ключевое слово new. После чего идет имя класса.

Давайте наполним кружку водой, и хорошенько размешаем.

$glass->set_water();// зальем водой

echo $glass->interfere_with();// помешаем

Вот, что я увидел на экране:

Вода в кружке

хм... Давайте добавим сахару

$glass->set_water();// зальем водой
$glass->set_sugar();// насыпим сахар

echo $glass->interfere_with();// помешаем

сладкая вода

Ну а теперь давайте добавим все ингредиенты

$glass->set_drink('кофе');// насыпим кофе
$glass->set_sugar();// насыпим сахар
$glass->set_water();// зальем водой

echo $glass->interfere_with();// помешаем

сладкий кофе

Данный пример конечно не покажет Вам всей пользы использования ООП, но если у Вас богатая фантазия, то Вы уже скорее всего увидели какие горизонты Вам открылись Смеюсь

Заключение

Мне осталось добавить, что объектов одного класса можно создать сколько угодно. Поэтому на своем столе (экране), Вы можете расположить несколько кружек, с разными напитками Улыбаюсь

Надеюсь данный пример Вам поможет приблизительно понять, что такое классы и объекты. Если есть какие либо вопросы, или просто комментарии, то пишите.

Всего Вам наилучшего! У меня все

 

Возможно Вам будут интересны следующие заметки

Комментарии (15)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
simofon, 10 Апреля 2013 г. 10:54 пишет:
Читатель
спасибо доступно, только вот с преимуществами пока сложновато - универсальность ??? уверен можно написать без класов с меньшем строк но вот если мы зальем туда не воду и засипим не сахар, тогда все пропало!?, в этом преимуществами я правильно понял?
Васян, 10 Апреля 2013 г. 11:12 пишет:
Гость
Отличная статья, отличный пример. Тоже только начал учить ооп, жаль что твои уроки по созданию cms сразу небыли объектно-ориентированными) но все-равно большое за них спасибо.
>Кстати, если свойство имеет область видимости publick
правильно public

и впревые слышу такие словосочетания:
>каждое утро наводим чай
>наводить чай или кофе

Но это не важно)
Дмитрий, 10 Апреля 2013 г. 12:47 пишет:
Читатель
Оригинально написано. А "var" не устарел?
Алексей, 10 Апреля 2013 г. 12:48 пишет:
Автор
От свойств зависит поведение объекта. В данном примере мы можем получить и сладкий чай и не сладкий кофе, используя два объекта одного и того же класса.
По сути мы получаем одну логику (класс то один), а вот объектов данного класса может быть 100500 штук =) В этом как раз и кроется вся прелесть...
Ответ для пользователя: simofon
Алексей, 10 Апреля 2013 г. 12:51 пишет:
Автор
Насчет устарел или нет не знаю, а вот то что ключевое слово "var" можно опустить, это точно..
Ответ для пользователя: Дмитрий
Алексей, 10 Апреля 2013 г. 12:52 пишет:
Автор
Спасибо за поправки =)
Ответ для пользователя: Васян
Дмитрий, 10 Апреля 2013 г. 13:00 пишет:
Читатель
Хорошим тоном считается объявление свойств и методов с областью видимости (public, protected, private). Я опускаю только когда класс маленький и не выполняет сложных телодвижений.
Ответ для пользователя: Алексей
Антон, 17 Апреля 2013 г. 00:51 пишет:
Гость
Дмитрий, var устарел, и является плохой практикой. Используйте указание области видимости.
Ответ для пользователя: Дмитрий
Санек, 05 Мая 2013 г. 18:55 пишет:
Читатель
Пример хорошо расписан, отличается от других. Антон верно написал)
dlegame, 23 Мая 2013 г. 13:54 пишет:
Читатель
У меня возник вопрос в RSBlog как можно реализовать переключение шаблонов? как в Data Life Engine
Алексей, 23 Мая 2013 г. 22:27 пишет:
Автор
В index.php есть переменная $theamBLOG. Она содержит имя папки в которой лежат шаблоны. Значение данной переменной можно переписать с помощью куки.
Ответ для пользователя: dlegame
dlegame, 25 Мая 2013 г. 08:07 пишет:
Читатель
Можете привести пример кода :) или помочь как его написать
Ответ для пользователя: Алексей
Алексей, 27 Мая 2013 г. 10:19 пишет:
Автор
Я пожалуй сегодня после работы попробую реализовать данную фишку с помощью дополнительных модулей... Глядишь хоть в кое то веки блог обновлю =)
Ответ для пользователя: dlegame
dlegamr, 27 Мая 2013 г. 18:19 пишет:
Читатель
Ок. спасибо ждём)))
Ответ для пользователя: Алексей
DropS, 18 Апреля 2014 г. 11:41 пишет:
Гость
Не плохо) все получилось не смотря на то что это мой первый урок) автору спс за столь понятное разъяснение !