Уроки PHP – Классы и введение в ООП

В последнем уроке категории мы рассмотрели функции в PHP, однако, чтобы двигаться дальше в освоении языка PHP, нужно изучить еще одну важную концепцию. Речь пойдет об ООП или объектно-ориентированном программировании. Объектно-ориентированное программирование – это стиль программирования, который призван заставить вас думать о программировании как о реальном мире. В ООП вы работаете с объектами, а не только с данными. Когда вы хотите создать новый объект, вы делаете это с помощью классов.

Классы – это фундаментальная часть ООП. Думайте о классе, как о каком-то проекте или прототипе. Он описывает, каким будет объект и что он может делать, содержит доступные свойства и методы. Простым примером класса может быть здание. Класс здания определяет особенности однотипного здания и то, как оно должно функционировать.

Используя класс здания, вы можете создать новое бетонное здание, и оно будет новым объектом. В ООП этот объект называется экземпляром класса. Классы и экземпляры можно сравнить с породами собак: собака – это класс, а каждая порода является экземпляром этого класса.

 

 

Классы в PHP

Давайте посмотрим на классы. В PHP класс может содержать переменные-члены. Эти переменные называются свойствами. Они используются для определения характеристик объекта. Когда вы хотите определить поведение, вы используете методы. Методы – это функции, по-другому. Функция, объявленная внутри объекта, является методом. Другое название, но это работает одинаково.

Каждый класс должен начинаться с ключевого слова class. После этого идет имя класса (название). Допустимое имя класса должно начинаться с буквы или нижнего подчеркивания, после чего может идти любое количество букв, цифр или подчеркиваний. После названия класса идут фигурные скобки {}, внутри которых содержатся свойства и методы, доступные в этом классе.



Пример класса:

<?php  class nameOfClass {    // здесь свойства и методы класса  }  

 

 

Пример класса Dog:

<?php  class Dog {   public $poroda; // свойства класса   public $vozrast;   public $mastb;   public $name;   // ниже метод (функция) класса   public function getInfo() {    echo "Порода собаки по имени $this->name – это $this->poroda. Возраст собаки – $this->vozrast, а масть – $this->mastb.";   }  }  

 

Примечание: ключевое слово public перед всеми свойствами и методом getInfo() является спецификатором видимости. Это говорит о том, что свойство или метод могут быть доступны из любого места в коде. Другие спецификаторы видимости: private и protected. О них мы поговорим немного позднее.

 

 

Экземпляры классов

Когда вы создаете новый объект класса или его экземпляр, это называется «созданием экземпляра». Чтобы создать экземпляр объекта класса, вы должны использовать ключевое слово new. Если вы хотите получить доступ к свойствам и методам объекта или экземпляра, вы должны использовать конструкцию стрелки ->. Если вы хотите присвоить значение свойству, используйте оператор присваивания =, как и в случае с переменной.

Давайте продемонстрируем это на примере с собакой. Сначала мы создали новый класс под названием Dog. Этот класс имеет несколько свойств, таких как «vozrast», «poroda», «mastb», «name» и один метод «getInfo». Далее мы создаем новый экземпляр этого класса под названием $DogOvcharka. Не забывайте о правилах именования переменных.

После этого мы назначаем конкретные значения всем свойствам, которые доступны в классе Dog, и новому экземпляру $DogOvcharka. И, наконец, мы будем вызывать метод getInfo() в $DogOvcharka, чтобы получить информацию об этом новом экземпляре.

<?php  class Dog {   public $poroda;   public $vozrast;   public $mastb;   public $name;   public function getInfo() {    echo "Порода собаки по имени $this->name – это $this->poroda. Возраст собаки – $this->vozrast, а масть – $this->mastb.";   }  }  // создание нового экземпляра класса Dog  $DogOvcharka = new Dog();  // присвоение новых значений свойствам объекта или экземпляра $DogOvcharka  $DogOvcharka->poroda = "овчарка";  $DogOvcharka->vozrast = "3 года";  $DogOvcharka->mastb = "белая";  $DogOvcharka->name = "Рекс";  // вызываем метод getInfo()  $DogOvcharka->getInfo();  // Результат: Порода собаки по имени Рекс – это овчарка. Возраст собаки – 3 года, а масть – белая.  ?>  

 

 

Классы и $this

Вы, вероятно, заметили, что мы использовали $this в методе getInfo() для доступа ко всем свойствам. $this является псевдопеременной. Это ссылка на объект или класс, с которым вы работаете в данный момент. Вы можете «перевести» $this в «этого объекта или класса». Другими словами, $this->name – это все равно, что сказать «свойство name этого объекта или класса».

 

 

Классы и наследуемость

Классы PHP могут наследовать свойства и методы другого класса. Когда один класс наследует свойства или методы другого, он называется подклассом. Класс, от которого наследуется подкласс, называется родительским классом. Когда вы хотите, чтобы один класс наследовал свойства или методы другого, вам нужно использовать ключевое слово extends.

Давайте рассмотрим простой пример, чтобы продемонстрировать, как работает наследование. Сначала мы создадим класс Chelovek. Этот класс будет содержать ряд открытых свойств и один метод. Затем мы будем использовать extends для создания двух подклассов под названием Muzchina и Zhenschina.

<?php  // родительский класс  class Chelovek {   public $name;   public $age;   public $isHuman = true;   public function skazhiHello() {    echo "Привет, меня зовут $this->name.";   }  }  // подкласс Muzchina, который наследует родительский класс Chelovek  // наследование свойств $name, $age, $isHuman и skazhiHello  // добавление свойства $pol  class Muzchina extends Chelovek {    public $pol = "мужской";  }  // подкласс Zhenschina, который наследует родительский класс Chelovek  // наследование свойств $name, $age, $isHuman и skazhiHello  // добавление свойства $pol  class Zhenschina extends Chelovek {    public $pol = "женский";  }  // новый экземпляр подкласса Muzchina  $ivan = new Muzchina();  // назначение новых значений доступным свойствам  $ivan->name = "Иван";  $ivan->age = "35";  // вызов метода skazhiHello()  $ivan->skazhiHello(); // результат: Привет, меня зовут Иван  // новый экземпляр подкласса Zhenschina  $julya = new Zhenschina();  // назначение новых значений доступным свойствам  $julya->name = "Юлия";  $julya->age = "25";  // вызов метода skazhiHello()  $julya->skazhiHello(); // результат: Привет, меня зовут Юлия  ?>  

 

 

Классы и видимость

Как вы уже знаете, PHP включает в себя нечто, что называется спецификатором видимости или типом видимости. Этот спецификатор определяет, как и откуда можно получить доступ к конкретному свойству и методу. До сих пор мы использовали открытый (public). Это ключевое слово указывает, что свойство или метод, с которым вы работаете, доступны из любого места. Помимо public, есть два других спецификатора: protected и private. Спецификатор protected делает свойства и методы доступными только внутри самого класса путем наследования, а также для родительских классов. Спецификатор private делает свойства и методы доступными только для класса, который их определяет. Помните, что в PHP каждое свойство класса должно иметь тип видимости.

 

Для методов это работает немного не так. Вы можете объявить метод без какого-либо явного типа видимости. Когда вы сделаете это, PHP автоматически объявит этот метод как открытый (public). Давайте использовать приведенный выше пример, чтобы продемонстрировать это. Мы добавим новый закрытый метод isHuman в родительский класс Chelovek. Затем мы попытаемся вызвать этот метод из подклассов Muzchina и Zhenschina. Оба вызова приведут к ошибке:

<?php  class Chelovek {   public $name;   public $age;   public $isHuman = true;   public function skazhiHello() {    echo "Привет, меня зовут $this->name.";   }   private function isHuman() {    echo "Особа по имени $this->name – человек: $this->isHuman";   }  }  class Muzchina extends Chelovek {    public $pol = "мужской";  }  class Zhenschina extends Chelovek {    public $pol = "женский";  }  $ivan = new Muzchina();  $ivan->isHuman(); // Uncaught Error: Call to protected method Chelovek::isHuman()  $julya = new Zhenschina();  $julya->isHuman(); // Uncaught Error: Call to protected method Chelovek::isHuman()  ?>  

 

 

Интерфейсы в PHP

Допустим, вы объявляете новый класс. Вам нужно указать список методов, которые должен реализовать этот класс. Это именно то, что интерфейс сделает для вас. Вы используете его для указания списка методов, которые должен реализовать какой-то класс. Вы можете определить новый интерфейс, используя ключевое слово interface. Синтаксис интерфейса выглядит как синтаксис класса.

Как реализуется интерфейс? Вы создаете новый класс и используете ключевое слово implements, за которым следует имя интерфейса. Сразу после имени класса и перед открывающей фигурной скобкой. Запомните три вещи. Во-первых, сам интерфейс не содержит реализации какого-либо метода. Это позволяет каждому классу, который использует интерфейс, обрабатывать метод по-разному.

Давайте рассмотрим один простой пример, чтобы проиллюстрировать, как работает интерфейс. Мы создадим новый интерфейс под названием «ChelovekInterface». Этот интерфейс будет содержать публичный метод skazhiHello(). Затем мы создадим два класса: Englishman и Frenchman. Оба будут реализовывать «ChelovekInterface», но оба будут обрабатывать skazhiHello() по-разному.

<?php  // создание нового интерфейса  interface ChelovekInterface {    public function skazhiHello();  }  // первый класс, который реализует интерфейс ChelovekInterface  class Englishman implements ChelovekInterface {   public function skazhiHello() {    echo "Hello!";   }  }  // второй класс, который реализует интерфейс ChelovekInterface  class Frenchman implements ChelovekInterface {   public function skazhiHello() {    echo "Bonjour!";   }  }  $john = new Englishman();  $john->skazhiHello(); // результат: "Hello!"  $marcel = new Frenchman();  $marcel->skazhiHello(); // результат: "Bonjour!"  ?>  

 

Примечание: имя интерфейса не обязательно должно включать слово Interface. Мы использовали его только для того, чтобы сделать код более читабельным. Вы можете использовать любое имя для интерфейса, который вы хотите, используя допустимые символы.

 

Во-вторых, один интерфейс может наследоваться другим, как класс. Вы можете сделать это с помощью ключевого слова extends. Третье, что нужно помнить, это то, что класс может реализовывать более одного интерфейса. Количество интерфейсов, которые может реализовать класс, не ограничено. Если вы хотите, чтобы класс реализовывал несколько интерфейсов, разделяйте их запятыми.

<?php  // создание первого интерфейса  interface FirstInterface {    public function foo();  }  // создание второго интерфейса  interface SecondInterface {    public function bar();  }  // создание третьего интерфейса, используя наследование  interface ThirdInterface extends SecondInterface {    public function bazz();  }  // класс, реализующий первый и второй интерфейс  class FooBar implements FirstInterface, SecondInterface {}  ?>  

 

 

 

Вот и все на сегодня! В следующих урокам мы будем продолжать углубленное изучение языка программирования PHP.