Очередной пример работы с классами в PHP

Тема в разделе 'PHP', создана пользователем Igogo, 16 июн 2011.

  1. Igogo Member

    Давайте сегодня разберем что такое класс, абстрактный класс и интерфейс.
    Только в этот раз разберем это все задом на перед :) то есть начиная с интерфейса и кончая классом.

    И так представим такую ситуация, есть некая компания программистов, состоящая из трех человек, 2 программиста и 1 ведущий программист и эта компания разрабатывает браузерную игру...

    ... в процессе разработки наши программисты доходят до пункта "персонажи" которых будит 2 вида - "воин" и "волшебник", естественно ведущий программист продумывает всю систему и дает задания своим коллегам.
    И так он ставит задачу что бы один программист занялся разработкой класса "Warrior", а второй разработкой класса "Wizard".
    Все вроде бы ясно, что тут может быть непонятного? Нужно создать всего 2 класса и все! Но не тут то было :) естественно если 2 программиста напишут эти классы то не факт что они будут вписываться в общую систему игры (которую задумал ведущий программист) и поэтому ему нужно перестраховаться и задать общую структуру для персонажей и по этому он решает написать интерфейс "character" который будит описывать стандартную структуру всех персонажей и игре!
    Сейчас я приведу возможный код данного интерфейса и дальше немного раскажу о самих интерфейсах.
    PHP:
    interface Character{
        
    // Описываем возможность атаковать
        
    public function attac();
        
    // Описываем возможность блокировать
        
    public function block();
        
    // Описываем возможность ходить
        
    public function go();
    }
    Вот наш небольшой интерфейс он просто описывает 3 возможности персонажей!
    Это все нужно для того что бы "в нашем случае" все персонажи в игре были с одинаковой структурой, то есть что бы все персонажи в игре могли ходить, атаковать и блокировать!
    То есть интерфейс для того и служит что бы задать некие правил создания классов которые реализуют данный интерфейс.
    Интерфейс нам говорит что бы мы в реализующем его классе ОБЯЗАТЕЛЬНО переопределяли все его "интерфейса" методы!
    Если мы не переопределим хотя бы один метод заданный в интерфейсе, то получим ошибку.

    Дальше по плану разобрать зачем абстрактные классы!?
    Они служат тоже для описания классов наследующих их, но в них в отличие от интерфейса уже можно задавать полноценные методы и свойства класса и можно задавать абстрактные методы, которые опять же нужно обязательно переопределить в наследуемом классе!

    И вот наш ведущий программист решил написать еще немного кода, которым он опишет класс "Human" и даст ему базовые возможности людей, по скольку в "нашей" игре все персонажи будут людьми то нам незачем писать в каждом классе персонажа стандартные людские возможности, можно просто вынести все это "например" в абстрактный класс и просто унаследовать все остальные классы от него.
    И тут у тех кто немного знаком с классами и наследованием должен появится вопрос - "почему именно абстрактный класс??", ну вообще нет разницы, но в моем примере это должен быть обязательно абстрактный класс по скольку в данной игре нельзя допустить что бы был создан экземпляр класса "Human" по тому что в нем нет смысла и он нужен только как шаблон для классов "Warrior" и "Wizard"! А поскольку нельзя получить обэкт абстрактного класса он то нам и подходит лучше всего!

    PHP:
    abstract class Human{
        public 
    $heands 2;
        public 
    $head 1;
        public 
    $legs2;


        public function 
    sleep(){
            echo 
    'zzzzZZZZ';
        }

        public function 
    lookTv(){
            echo 
    'look discovery =)';
        }

        public function 
    eat(){
            echo 
    'eechh fucking macdonalds bueee';
        }
    }
    Вот наш абстрактный класс, в нем мы говорим что каждый человек имеет 2 ноги, 2 руки, 1 голову и что немало важно умеет спать, кушать и смотреть телевизор =)

    Вот в принципе мы и дошли до самого просто го что есть в ООП, до классов естественно ;)
    Они у нас будут выглядеть примерно так -

    PHP:
    class Warrior extends Human implements Character{
        public function 
    attac(){
            
    //Тут описываем как воин рубит мечем
        
    }
        public function 
    block(){
            
    //Тут описываем как воин защищается щитом
        
    }
        public function 
    go(){
            
    //Тут описываем как воин скачет на своем коне
        
    }
    }


    class 
    Wizard extends Human implements Character{
        public function 
    attac(){
            
    //Тут описываем как волшебник раскидует фаерболы и волшебные стрелы во все стороны
        
    }
        public function 
    block(){
            
    //Тут описываем как волшебник защищается волшебным щитом
        
    }
        public function 
    go(){
            
    //Тут описываем как волшебник перемещяется спомощю магических порталов
        
    }
    }
    И приведу пример использования нашего кода -
    PHP:
    $human = new Human(); //Выдаст ошибку по тому что класс абстрактный

    $wizard = new Wizard();
    echo 
    $wizard->legs// 2
    echo $wizard->head// 1
    $wizard->sleep(); // zzzzZZZZ
    $wizard->attac(); // Выполнит действия которые написаны в методе attac класса Wizard естественно ))
    Думаю что тут все понятно, все вопросы задавайте в комментах!
  2. RooTM Administrator

    Креативный урок:)Спасибо
  3. juniorspecialistphp New Member

    Очень доступно и понятно, спасибо :)

Поделиться этой страницей