04.04.2022 в 01:03 (ред.)

Объектно-ориентированное программирование на PHP

В этом курсе мы изучим объектно-ориентированное программирование на языке PHP, классы, методы, объекты и т.п.

Введение

Для изучения Объектно-Ориентированного Программирования (ООП) нам нужно иметь под рукой удобный редактор кода и сервер для работы PHP.

Я использую для работы с кодом Sublime Text 3, Notepad++ и Visual Studio Code.

Для полноценной работы с PHP я использую сервер Openserver (ospanel.io).

Кроме того мы будем частенько заглядывать в официальную документацию 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;

Модификаторы доступа

Здесь я забегаю немного вперед и сразу хочу поговорить про такую терминологию как “модификаторы доступа”.

Это ключевые слова publicprotected или private определяют область видимости свойства. Лучше уже на данном этапе знать о том, что существуют данные ключевые слова. Тогда будет проще изучать свойства и методы классов далее.

Из документации PHP. Доступ к свойствам и методам класса, объявленным как 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.

Статья дополняется...
PHP

Подпишитесь на новости

Никакого спама, только новости и полезные материалы