Изучим основы объектно-ориентированного программирование (ООП) на языке PHP, классы, методы, объекты и т.п. Это один из самых важных разделов не только в PHP, но и в целом в рамках программирования на любом языке.
Что нам нужно?
Для изучения Объектно-Ориентированного Программирования (ООП) нам нужно иметь под рукой удобный редактор кода и сервер для работы PHP. Я использую для работы с кодом Sublime Text 3, Notepad++ и Visual Studio Code.
Для полноценной работы с PHP я использую сервер Openserver (ospanel.io).
Кроме того мы будем частенько заглядывать в официальную документацию PHP на, собственно, официальном сайте.
Знакомство с ООП в PHP
Язык PHP включает в себя такое понятие как объектная модель, которая содержит в себе классы, объекты, метода и т.д. О многих вещах мы поговорим ниже.
Класс — это шаблон кода для создания объектов одного класса. По сути, класс является формальным описанием объекта. Или, говоря простым языком, это схема или чертеж по которому потом создаются объекты.
Например, чертеж дома — это класс, а сам дом, построенный по этому чертежу — объект.
Каждый объект может обладать своими собственными свойствами и методами, которые мы рассмотрим далее в курсе.
Но вкратце, свойства — это переменные, а методы — это функции.
Классы и объекты
Немного про классы и объекты мы поговорили, давайте подготовим проект для работы. Создадим два файла и папку:
Как видно со скриншота выше мы создали файлы index.php, FirstClass.php и папку classes.
В файле index.php подключим наш файл в котором будем работать с классом:
<?php
require_once 'classes/FirstClass.php';
- один класс помещать в отдельный файл,
- имя класса должно совпадать с именем класса,
- имена классов должны быть написаны в CamelCase, точнее PascalCase.
Все это описывается в базовом стандарте PSR — https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md.
Кроме того, согласно стандарту:
- Константы класса ДОЛЖНЫ быть объявлены во всех верхних регистрах с разделителями подчеркивания.
- Имена методов ДОЛЖНЫ быть объявлены в camelCase.
- Нельзя использовать зарезервированные слова
Данное руководство по ссылке выше намеренно избегает каких-либо рекомендаций относительно использования имен свойств $StudlyCaps, $camelCase или $under_score.
Пример:
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
private $StudlyCapsProp = null;
protected $camelCaseProp = null;
public $under_score_prop = null;
public function fooBar()
{
}
}
Но давайте вернемся к нашему курсу и создадим наш первый класс:
<?php
class FirstClass
{
}
Создадим теперь объект из этого класса или экземпляр класса:
<?php
class FirstClass
{
}
// создаем объект класса
new FirstClass; // или new FirstClass();
// можно присвоить переменной
$newObject = new FirstClass;
Модификаторы доступа
Здесь я забегаю немного вперед и сразу хочу поговорить про такую терминологию как «модификаторы доступа».
Это ключевые слова public
, protected
или private
определяют область видимости свойства. Лучше уже на данном этапе знать о том, что существуют данные ключевые слова. Тогда будет проще изучать свойства и методы классов далее.
Подробнее о модификаторах мы поговорим дальше в курсе.
Свойства объектов
Свойство класса/объекта, простыми словами, — это переменная описанная в классе. Эта формулировка не до конца верна, но немного упрощает понимание понятия свойства.
Создадим по канонам всех классических туториалов класс Car
:
<?php
class Car
{
}
И далее определим свойство класса, держа в голове, что мы уже знаем про модификаторы доступа, о которых поговорили выше.
Добавим свойства для нашей машины — цвет, количество колес, и скорость.
<?php
class Car
{
public $color;
public $wheels;
public $speed;
}
Добавим еще бренд и значения некоторых свойств по умолчанию:
<?php
class Car
{
public $color;
public $wheels = 4;
public $speed = 120;
public $brand;
}
Все, наш класс готов, свойства созданы и теперь можем создать объект этого класса bmw
и вывести подтверждение на экран:
<?php
require_once 'classes/Car.php'; // подключение файла с классом Car
$bmw = new Car; // создание нового объекта
var_dump($bmw); // вывод информации об объекте
Напоминаю, что у нас класс Car
находится в отдельном файле в папке classes, а подключение файла с классом и создание нового объекта происходит в файле index.php.
Есть еще один отличный лайфхак для удобной работы с выводом данных, который можно использовать при работе с массивами и объектами. Мы создадим небольшую функцию deb
(от слова debug) в папке includes и подключим ее в файле index.php:
<?php
function deb($data){
echo '<pre>' . print_r($data, 1) . '</pre>';
}
А файл index.php теперь выглядит так:
<?php
require_once 'includes/functions.php';
require_once 'classes/Car.php';
$bmw = new Car;
deb($bmw);
В браузере мы видим удобное отображение нашего объекта:
Car Object
(
[color] =>
[wheels] => 4
[speed] => 120
[brand] =>
)
Значения для свойств объекта мы можем добавлять вне класса, не обязательно значения определять внутри класса. Но свойство должно иметь модификатор доступа — public
.
Давайте поменяем скорость для нашего объекта класса Car
. Делается это простым способом:
$bmw->speed = 180;
Давайте также определим цвет машины и название бренда, после чего выведем всё на экран:
$bmw->speed = 180;
$bmw->color = 'Black';
$bmw->brand = 'BMW';
deb($bmw); // функция удобного вывода на экран, которую мы определили ранее
При обращении к свойству знак доллара ($) мы не ставим. Таким образом мы можем создать множество объектов. Например, создадим второй объект этого класса и определим его свойства:
$vaz = new Car;
$vaz->speed = 100;
$vaz->color = 'Silver';
$vaz->brand = 'VAZ';
deb($vaz);
Кроме уже созданных свойств мы можем добавлять свойства для объекта, которых нет в классе. Допустим мы хотим создать свойство «год выпуска» для объекта $vaz:
$vaz = new Car;
$vaz->speed = 100;
$vaz->color = 'Silver';
$vaz->brand = 'VAZ';
$vaz->year = '1999'; // добавили год к объекту
deb($vaz);
Давайте теперь посмотрим как мы можем вывести информацию про наши созданные объекты на веб-страницу, чтобы пользователям было удобно читать все данные.
echo "Марка машины: {$vaz->brand}" . "<br>";
echo "Цвет машины: {$vaz->color}" . "<br>";
echo "Скорость машины: {$vaz->speed}" . "<br>";
echo "Колес: {$vaz->wheels}" . "<br>";
// можно и так
echo "Колес: $vaz->wheels" . "<br>";
В PHP если имя переменной заключено в двойные (не одинарные!) кавычки, то переменная интерполируется, что мы видим в выводе на страницу:
Марка машины: VAZ
Цвет машины: Silver
Скорость машины: 100
Колес: 4
Важное замечание стоит сделать, что с версии PHP 5.6 мы можем при определении свойств в значениях использовать выражения (2 + 2), конкатенацию ( ‘Hi’ . ‘ John’ ) и т.д.
Методы объектов
Кроме свойств объектов, о которых мы поговорили выше, у объектов могут быть методы. Если простыми словами, то методы помогают объектам выполнять разные задачи и производить действия.
Объявление методов схожи с объявлением свойств. Мы должны использовать модификаторы доступа.
Определим метод, который выводит информацию об объекте, в нашем случае о машинах.
<?php
class Car
{
public $color;
public $wheels;
public $speed;
public $brand;
public function getCarInfo(){
}
}
Не совсем верно называть функции методами, но если отбросить все домыслы, то это вполне так. В целом, при объявлении метода модификатор можно не указывать, тогда метод будет по умолчанию public
. При объявлении свойств модификатор нужен обязательно.
Обращаемся к методам мы также как и к свойствам объекта.
echo $vaz->getCarInfo()
Итак, мы объявили метод и давайте разместим в него ту часть кода, где выводится информация о машине. Но вместо созданного объекта мы будем использовать специальный оператор или псевдопеременную $this
:
<?php
class Car
{
public $color;
public $wheels;
public $speed;
public $brand;
public function getCarInfo(){
return "Марка машины: {$this->brand}<br>
Цвет машины: {$this->color}<br>
Скорость машины: {$this->speed}<br>
Колес: {$this->wheels}<br>";
}
}
Если внутри класса мы хотим обратиться к свойству или методу мы должны использовать $this
.
Материал дополняется…