PHP: полный мануал с примерами, функциями и ООП
Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Дерево руководства
Глава 201 · Практика
Предопределённые интерфейсы и классы: карта контрактов PHP
Корневая карта встроенных интерфейсов и выбор контракта по реальной задаче.
Предопределённые интерфейсы и классы: договоры ядра
Интерфейс отвечает на вопрос «что объект обязуется уметь». Благодаря общему контракту foreach, count(), сортировка и обработка ошибок работают с разными классами одинаковым способом. Корневая страница официального справочника — каталог таких договоров и связанных служебных классов.
| Семейство | Практический смысл | Куда идти дальше |
|---|---|---|
| Traversable, Iterator, IteratorAggregate | Объект можно пройти через foreach | итераторы |
| ArrayAccess | Доступ к объекту синтаксисом квадратных скобок | ArrayAccess |
| Countable | Объект принимает count() | Countable |
| Stringable | Объект умеет представить себя строкой | Stringable |
| Throwable | Общий тип Error и Exception | исключения |
| UnitEnum, BackedEnum | Общий API перечислений | перечисления |
| Closure, Generator, Fiber | Выполняемое поведение и приостанавливаемое выполнение | Closure |
| WeakReference, WeakMap, SensitiveParameterValue | Служебные модели памяти и диагностики | встроенные классы |
<?php
final class OrderLines implements IteratorAggregate, Countable
{
public function __construct(private array $lines) {}
public function getIterator(): Traversable
{
return new ArrayIterator($this->lines);
}
public function count(): int
{
return count($this->lines);
}
}
$lines = new OrderLines(['Чай', 'Кофе']);
echo count($lines), " позиции\n";
foreach ($lines as $line) {
echo '- ', $line, "\n";
}
Ожидаемый результат
2 позиции
- Чай
- Кофе
IteratorAggregate обещает getIterator(), а Countable — count(). PHP проверяет наличие совместимых методов. Интерфейс не хранит строки за объект: он задаёт контракт, который реализует класс.
<?php
final class ApiResult implements JsonSerializable
{
public function __construct(
private int $status,
private array $data,
private string $internalTraceId,
) {}
public function jsonSerialize(): array
{
return ['status' => $this->status, 'data' => $this->data];
}
}
$result = new ApiResult(200, ['orderId' => 17], 'trace-secret-42');
echo json_encode($result, JSON_THROW_ON_ERROR), "\n";
Ожидаемый результат
{"status":200,"data":{"orderId":17}}
json_encode() узнаёт договор JsonSerializable и вызывает jsonSerialize(). Класс сам определяет публичную форму ответа: обязательные данные выходят, а внутренний trace ID не раскрывается. Это практическая польза интерфейса — готовая функция PHP работает с вашим объектом через известный контракт.
Источники и обсуждения
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


