PHP: Объектно-ориентированный дизайн (Hexlet)

О курсе

  • Текучий интерфейс (Fluent Interface)
  • stdClass — встроенный в PHP класс, который автоматически используется при преобразовании типов
  • Структуры данных — ОО-версии популярных структур данных.
  • PHPUnit — фреймворк для тестирования в PHP
  • Collect — библиотека для работы с коллекциями в ОО-стиле
  • Carbon — библиотека для работы с датами в ОО-стиле
  • Stringy — библиотека для работы со строками в ОО-стиле

Шаблоны Проектирования

Конфигурация

Вместо

<?php

// В одном месте
$html1 = markdownToHtml($markdown1, ['sanitize' => true]);

// Где-то в другом месте
$html2 = markdownToHtml($markdown2, ['sanitize' => true]);

Используем «конфигурирование»

<?php

$md = new Markdown(['sanitize' => true]);
$html1 = $md->render($markdown1);
$html2 = $md->render($markdown2);

Конфигурирование — передача опций (различных настроек необходимых данной библиотеке) в конструктор во время создания объекта

Дополнительные материалы

Изменяемая конфигурация

Как изменить конфигурацию ждя конкретного вызова метода

  1. Каждый раз новый объект
  2. Сеттер
  3. Дополнительный параметр в метод (!)

stdClass

stdClass — предопределенный класс php

в stdClass нет предопределённых свойств и методов, но объекты этого класса могут наполняться любыми свойствами в процессе работы

<?php

$obj = new stdClass();
$obj->key = 'value';

var_dump($obj);
// class stdClass#1 (1) {
//   public $key =>
//   string(5) "value"
// }

Преобразование ассоциативного массива в объект приводит к созданию объекта класса stdClass;

<?php

$userAsArray = [
  'name' => 'George',
  'age' => 18
];

$userAsObject = (object) $userAsArray;

var_dump($userAsObject);
// class stdClass#2 (2) {
//   public $name =>
//   string(6) "George"
//   public $age =>
//   int(18)
// }

Многие фреймворки используют stdClass для хранения конфигурации

PHPUnit

  • Каждый тестовый класс состоит из тестовых методов.
  • Тестовые методы всегда начинаются с префикса test
  • Проверки в PHPUnit выполняются с помощью специальных  функций, например
    • Метод assertEquals принимает на вход два значения: Expected — ожидаемый результат — то, что должна вернуть функция и Actual — оезультат, который на самом деле вернула функция.
    • assertTrue (и assertFalse) — принимают только один аргумент.

Дизайн тестов на основе классов теряет свою популярность. Современный подход растёт из BDD процесса. Синтаксически такие тесты часто полагаются на функции высшего порядка describe и it.

<?php

describe('Example', function () {
    $object = new stdClass();
    $object->name = 'pho';

    context('name', function () use ($object) {
        it('is set to pho', function()  use ($object) {
            expect($object->name)->toBe('pho');
        });
    });
});