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

Дерево руководства
Глава 425 · После первых изображений, объектов и clone
Gmagick: линза, закручивание и соляризация
Управлять силой и знаком деформации, выбрать порог QuantumRange и сохранить независимые варианты.
Втянуть центр изображения, сохранив оригинал
Для необычной обложки втянем середину упаковки. Видно, как прямые стороны изгибаются к центру, а маленький круг этикетки уменьшается. Параметр 0.5 задаёт силу деформации; он не означает радиус 0.5 px. Исходник остаётся отдельным объектом.


$source = new Gmagick("effects.ppm");
$pinched = clone $source;
$returned = $pinched->implodeImage(0.5);
$pinched->setImageFormat("PNG"); $pinched->writeImage("pinched.png");PHP.net называет параметр radius и описывает сжатие пикселей как percentage; сигнатура исторически возвращает mixed, текст результата — Gmagick. В текущем расширении операция меняет получателя и возвращает тот же объект: $returned===$pinched. Поэтому новую независимую копию создаёт именно clone, а не обещание «new image» в кратком описании. В программе также проверяется нейтральный 0. Центр определяется изображением: аргументов x/y у метода нет.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/effects.ppm');$before=$source->getImageSignature();
$pinched=clone $source;$returned=$pinched->implodeImage(0.5);
$neutral=clone $source;$neutral->implodeImage(0);
gmPng($source,'gm99-fx-implode-before.png');gmPng($pinched,'gm99-fx-implode-after.png');
gmReport('gm99-fx-implode',["gmagick.implodeimage"],["gm99-fx-implode-before.png", "gm99-fx-implode-after.png"],['same_object'=>$returned===$pinched,'effect_changes'=>$pinched->getImageSignature()!==$before,'zero_is_neutral'=>$neutral->getImageSignature()===$before,'source_kept'=>$source->getImageSignature()===$before],$errors??[],[],['gmagick.implodeimage'=>'applied']);
echo "implode: amount=0.5 changed=yes zero=neutral return=same-object\n";
Ожидаемый результат
implode: amount=0.5 changed=yes zero=neutral return=same-object
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Ожидается деформированный PNG того же размера. Упражнение: сохранить обычную карточку и сделать фантазийную обложку. Решение: брать обе из исходника, а не пытаться точно отменить эффект обратным знаком; интерполяция уже изменила данные. Для технической фотографии товара такая деформация может исказить представление о форме.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Закрутить рисунок вокруг центра
Закрутим рисунок на 60° вокруг центра. Смотрите на линии этикетки: они становятся кривыми, поэтому swirlImage отличается от обычного поворота всей картинки. Это деформация расположения пикселей, а не смаз по дугам.


$source = new Gmagick("effects.ppm");
$twisted = clone $source;
$twisted->swirlImage(60);
$twisted->setImageFormat("PNG"); $twisted->writeImage("twisted.png");Единственный float degrees задаёт закручивание в градусах. PHP.net описывает усиление эффекта при изменении значения от 1 до 360; это объяснение характера эффекта, а не объявленная в сигнатуре проверка диапазона. Наш 0 проверяется как нейтральный. Передача массива вместо числа вызывает TypeError; смысловую границу силы эффекта прикладная функция задаст отдельно в следующем сценарии.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/effects.ppm');$twisted=clone $source;$twisted->swirlImage(60);
$neutral=clone $source;$neutral->swirlImage(0);
gmPng($source,'gm99-fx-swirl-before.png');gmPng($twisted,'gm99-fx-swirl-after.png');
$errors=['wrong_type'=>gmTry(fn()=>(clone $source)->swirlImage([]))];
gmReport('gm99-fx-swirl',["gmagick.swirlimage"],["gm99-fx-swirl-before.png", "gm99-fx-swirl-after.png"],['effect_changes'=>$twisted->getImageSignature()!==$source->getImageSignature(),'zero_is_neutral'=>$neutral->getImageSignature()===$source->getImageSignature()],$errors??[],[],['gmagick.swirlimage'=>'applied']);
echo "swirl: degrees=60 changed=yes zero=neutral array=caught\n";
Ожидаемый результат
swirl: degrees=60 changed=yes zero=neutral array=caught
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Ожидается новая форма линий без изменения размера холста. Упражнение: нужны вращательные дуги, как от движения камеры. Решение: выбрать rotationalBlurImage из связанного раздела Imagick; swirl меняет форму, а размытие усредняет значения по траектории. Не подменяйте одно другим из-за похожего впечатления движения.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Изменить светлые каналы с порогом QuantumRange
Для экспериментальной палитры инвертируем только достаточно светлые значения каналов. У исходника в точке 280,50 RGB237,235,220. После порога 0.5×QuantumRange получается 18,20,35: каждое достаточно светлое значение заменяется дополнением до 255 в PNG8. На схеме остаются видны границы, но светлый фон становится тёмным.


$image = new Gmagick("effects.ppm");
$quantumRange = (int) (2 ** Gmagick::QUANTUM_DEPTH - 1);
$threshold = (int) round($quantumRange * 0.5);
$image->solarizeImage($threshold);
$image->setImageFormat("PNG"); $image->writeImage("solarized.png");Официальный threshold — целое значение от 0 доQuantumRange. В нашей Q16-сборке это 0…65535, половина после round равна 32768; число 50 не означает 50%. round округляет рассчитанную величину, (int) делает её целым для сигнатуры метода. Сохранение в PNG8 не превращает внутреннюю шкалу метода в 0…255. Полная программа проверяет конкретную яркую точку и то, что максимальный порог сохраняет этот исходник.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/effects.ppm');$q=(int)(2**Gmagick::QUANTUM_DEPTH-1);$threshold=(int)round($q*0.5);
$result=clone $source;$result->solarizeImage($threshold);
$unchanged=clone $source;$unchanged->solarizeImage($q);
gmPng($source,'gm99-fx-solarize-before.png');gmPng($result,'gm99-fx-solarize-after.png');
$beforeRgb=gmRgb($source,280,50);$afterRgb=gmRgb($result,280,50);
gmReport('gm99-fx-solarize',["gmagick.solarizeimage"],["gm99-fx-solarize-before.png", "gm99-fx-solarize-after.png"],['effect_changes'=>$result->getImageSignature()!==$source->getImageSignature(),'max_is_neutral'=>$unchanged->getImageSignature()===$source->getImageSignature(),'bright_pixel_inverted'=>$afterRgb===array_map(fn($c)=>255-$c,$beforeRgb)],$errors??[],['quantum_range'=>$q,'threshold'=>$threshold,'before_rgb'=>$beforeRgb,'after_rgb'=>$afterRgb],['gmagick.solarizeimage'=>'applied']);
echo "solarize: threshold=half-quantum bright-pixel=inverted max=neutral\n";
Ожидаемый результат
solarize: threshold=half-quantum bright-pixel=inverted max=neutral
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Эффект похож на выборочную инверсию при фотохимической соляризации, но здесь это вычисление каналов готового изображения. Упражнение: перенести рецепт на Q8. Решение: вычислять диапазон из QUANTUM_DEPTH и доли, а не переносить 32768 как универсальную константу. Для цветокоррекции каталога такая художественная палитра обычно не заменяет естественные цвета товара.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Выбрать втягивание или выпуклую линзу
Дадим редактору два осмысленных варианта: втянутый центр и выпуклую линзу. Положительное 0.5 сжимает середину нашей схемы, отрицательное−0.5 её расширяет. Оба получаются из исходника, а не друг из друга.



$source = new Gmagick("effects.ppm");
$in = clone $source; $out = clone $source;
$in->implodeImage(0.5);
$out->implodeImage(-0.5);
$in->setImageFormat("PNG"); $in->writeImage("pinch.png");
$out->setImageFormat("PNG"); $out->writeImage("bulge.png");Функция lensPreview ниже проверяет, что значение конечное, и ограничивает его диапазоном−0.5…0.5. Это наш удобный диапазон для этого макета, а не документированный глобальный предел Gmagick. is_finite отклоняет бесконечность и NaN, затем clone защищает исходник. Метод не принимает положение центра. Если нужен другой центр, сначала следует отдельно спроектировать преобразование холста; простое добавление аргументов x/y не поддерживается.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
function lensPreview(Gmagick $source,float $amount):Gmagick {
if(!is_finite($amount)||$amount < -0.5||$amount > 0.5)throw new InvalidArgumentException('This catalog accepts amounts from -0.5 to 0.5');
$copy=clone $source;$copy->implodeImage($amount);return $copy;
}
$source=new Gmagick(__DIR__.'/effects.ppm');$in=lensPreview($source,0.5);$out=lensPreview($source,-0.5);
gmPng($source,'gm99-fx-lens-policy-before.png');gmPng($in,'gm99-fx-lens-policy-in.png');gmPng($out,'gm99-fx-lens-policy-out.png');
$errors=['outside_policy'=>gmTry(fn()=>lensPreview($source,2))];
gmReport('gm99-fx-lens-policy',["gmagick.implodeimage"],["gm99-fx-lens-policy-before.png", "gm99-fx-lens-policy-in.png", "gm99-fx-lens-policy-out.png"],['both_change'=>$in->getImageSignature()!==$source->getImageSignature()&&$out->getImageSignature()!==$source->getImageSignature(),'signs_differ'=>$in->getImageSignature()!==$out->getImageSignature()],$errors??[],[],['gmagick.implodeimage'=>'applied']);
echo "lens: plus=pinch minus=bulge policy-range=checked source=kept\n";
Ожидаемый результат
lens: plus=pinch minus=bulge policy-range=checked source=kept
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Ожидаются два различимых результата с противоположным характером формы. Упражнение: сделать эффект у левого края без изменения окружения. Решение: не обещать это текущей функцией; нужен отдельный алгоритм с областью обработки и проверкой краёв. Ссылка на реальный вопрос ниже показывает именно эту потребность, но его Python/ImageMagick-код не объявляется API Gmagick.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Сделать парные обложки с противоположным изгибом
Для двух обложек серии нужны противоположные изгибы. Создадим варианты−60° и+60° из одного источника. Названия файлов отражают знак, а объект исходника сохраняет неизменённую упаковку.



$source = new Gmagick("effects.ppm");
$minus = clone $source; $plus = clone $source;
$minus->swirlImage(-60);
$plus->swirlImage(60);
$minus->setImageFormat("PNG"); $minus->writeImage("cover-minus.png");
$plus->setImageFormat("PNG"); $plus->writeImage("cover-plus.png");Функция twistPreview ограничивает модуль угла 90° для этого дизайна: abs берёт абсолютное значение, поэтому проверка одинаково действует на оба знака. Это редакционная граница, не официальный предел метода. Противоположные знаки меняют направление изгиба; применение+60 после−60 к одной копии не является обещанной точной отменой, поскольку при каждом шаге выполняется растровая интерполяция.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
function twistPreview(Gmagick $source,float $degrees):Gmagick {
if(!is_finite($degrees)||abs($degrees)>90)throw new InvalidArgumentException('This cover accepts at most 90 degrees');
$copy=clone $source;$copy->swirlImage($degrees);return $copy;
}
$source=new Gmagick(__DIR__.'/effects.ppm');$left=twistPreview($source,-60);$right=twistPreview($source,60);
gmPng($source,'gm99-fx-swirl-pair-before.png');gmPng($left,'gm99-fx-swirl-pair-minus.png');gmPng($right,'gm99-fx-swirl-pair-plus.png');
$errors=['outside_policy'=>gmTry(fn()=>twistPreview($source,180))];
gmReport('gm99-fx-swirl-pair',["gmagick.swirlimage"],["gm99-fx-swirl-pair-before.png", "gm99-fx-swirl-pair-minus.png", "gm99-fx-swirl-pair-plus.png"],['signs_differ'=>$left->getImageSignature()!==$right->getImageSignature(),'both_change'=>$left->getImageSignature()!==$source->getImageSignature()&&$right->getImageSignature()!==$source->getImageSignature()],$errors??[],[],['gmagick.swirlimage'=>'applied']);
echo "covers: angles=-60,+60 independent-clones=yes policy=checked\n";
Ожидаемый результат
covers: angles=-60,+60 independent-clones=yes policy=checked
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Упражнение: нужно пять вариантов угла. Решение: на каждом шаге брать новый clone исходника и сохранять отдельный файл, затем выбирать по реальному превью. Изменение только имени файла не сбрасывает состояние уже обработанного объекта.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Перевести долю в целый порог для двух палитр
Предложим редактору две экспериментальные палитры с порогами 25% и 75% диапазона. Это доли порога, а не проценты непрозрачности или число изменённых пикселей. На нашей схеме меньший порог затрагивает больше значений каналов.



$source = new Gmagick("effects.ppm");
$q = (int) (2 ** Gmagick::QUANTUM_DEPTH - 1);
$quarter = clone $source; $threeQuarter = clone $source;
$quarter->solarizeImage((int) round($q * 0.25));
$threeQuarter->solarizeImage((int) round($q * 0.75));
$quarter->setImageFormat("PNG"); $quarter->writeImage("palette25.png");
$threeQuarter->setImageFormat("PNG"); $threeQuarter->writeImage("palette75.png");Прикладная функция solarizedPreview принимает fraction в диапазоне 0…1, переводит её в целый threshold и только затем вызывает метод. Вызов с 50 отвергается: иначе смешались бы разные единицы. Точные значения порога зависят от QuantumDepth, а число изменённых пикселей — ещё и от содержимого входа. Для двух независимых вариантов опять нужны две копии.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
function solarizedPreview(Gmagick $source,float $fraction):Gmagick {
if(!is_finite($fraction)||$fraction<0||$fraction>1)throw new InvalidArgumentException('Use fraction from 0 to 1');
$q=(int)(2**Gmagick::QUANTUM_DEPTH-1);$threshold=(int)round($q*$fraction);
$copy=clone $source;$copy->solarizeImage($threshold);return $copy;
}
$source=new Gmagick(__DIR__.'/effects.ppm');$quarter=solarizedPreview($source,0.25);$threequarter=solarizedPreview($source,0.75);
gmPng($source,'gm99-fx-solarize-presets-before.png');gmPng($quarter,'gm99-fx-solarize-presets-quarter.png');gmPng($threequarter,'gm99-fx-solarize-presets-threequarter.png');
$errors=['percentage_confusion'=>gmTry(fn()=>solarizedPreview($source,50))];
gmReport('gm99-fx-solarize-presets',["gmagick.solarizeimage"],["gm99-fx-solarize-presets-before.png", "gm99-fx-solarize-presets-quarter.png", "gm99-fx-solarize-presets-threequarter.png"],['palettes_differ'=>$quarter->getImageSignature()!==$threequarter->getImageSignature(),'both_change'=>$quarter->getImageSignature()!==$source->getImageSignature()&&$threequarter->getImageSignature()!==$source->getImageSignature()],$errors??[],[],['gmagick.solarizeimage'=>'applied']);
echo "solarize-presets: fractions=0.25,0.75 palettes=different percent50=rejected\n";
Ожидаемый результат
solarize-presets: fractions=0.25,0.75 palettes=different percent50=rejected
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Ожидаются разные палитры и сохранный оригинал. Упражнение: интерфейс прислал строковое поле «75». Решение: сначала проверить числовой ввод и диапазон 0…100 на границе формы, затем разделить на 100 и передать 0.75. Не перекладывайте неоднозначность пользовательских единиц на библиотечный фильтр.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Из реальной задачи разработчика
how to use the implode effect from wand(python) from another position (not the middle of the image)?. При implode в Python/Wand эффект расположен в центре; нужен другой центр деформации. Наши PHP-программы явно показывают центр текущего холста и различие положительной/отрицательной силы, а функция ограничивает только согласованный диапазон дизайна. У Gmagick::implodeImage нет x/y: перенос центра требует отдельного преобразования холста и проверки краёв, а не добавления несуществующих аргументов. Код сторонней оболочки не объявляется поддержанным Gmagick API.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::implodeimageДеформировать область вокруг центра
PECL gmagick >= Unknown · gmagick
Gmagick::implodeimage(float $radius): mixedОфициальный текст описывает новую копию с пикселями, втянутыми на заданную percentage, называет обязательный float параметр radius и указывает mixed в сигнатуре, Gmagick в описании результата. В текущем расширении вызов меняет получателя и возвращает тот же Gmagick: независимость обеспечивает явный clone. Наши 0.5 и−0.5 означают силу втягивания/выпуклости, а не пиксельный радиус;0 нейтрален для проверенного входа. Аргументов позиции центра нет. Интерполяция не гарантирует точную отмену противоположным значением. Диапазон−0.5…0.5 в прикладной функции — наша политика макета, а не объявленный предел всей библиотеки.
Gmagick::implodeimage(float $radius): mixed| Параметр | Тип и обязательность | Смысл |
|---|---|---|
| $radius | float; обязательный | Сила деформации с таким официальным именем параметра; не радиус в пикселях. |
Официальная ошибка метода — GmagickException. Ошибка PHP-типа может быть TypeError; нарушение прикладного диапазона в наших функциях намеренно даёт InvalidArgumentException до библиотечного вызова. Эти прикладные ограничения не объявляются проверками самого расширения.
Два применения: Втянуть центр изображения, сохранив оригинал; Выбрать втягивание или выпуклую линзу.
Отметка доступности PHP.net: PECL gmagick >= Unknown. Unknown не задаёт известную минимальную версию. Наше окружение: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; фактические границы указаны выше.
Gmagick::solarizeimageПрименить соляризацию с целым порогом
PECL gmagick >= Unknown · gmagick
Gmagick::solarizeimage(int $threshold): GmagickПрименяет эффект, похожий на выборочное дополнительное экспонирование фотобумаги в лаборатории. Обязательный int threshold находится в диапазоне 0…QuantumRange и определяет степень соляризации. Возвращается Gmagick. Это не процент 0…100 и не обязательно шкала PNG8: при Q16 QuantumRange равен 65535. В примере доля 0.5 округляется до 32768, яркая точка RGB237,235,220 становится 18,20,35. Максимальный порог сохраняет наш исходник. Доли 25% и 75% переводятся в целые значения явной функцией, которая заранее проверяет пользовательские единицы.
Gmagick::solarizeimage(int $threshold): Gmagick| Параметр | Тип и обязательность | Смысл |
|---|---|---|
| $threshold | int; обязательный | Целый порог от 0 доQuantumRange текущей сборки. |
Официальная ошибка метода — GmagickException. Ошибка PHP-типа может быть TypeError; нарушение прикладного диапазона в наших функциях намеренно даёт InvalidArgumentException до библиотечного вызова. Эти прикладные ограничения не объявляются проверками самого расширения.
Два применения: Изменить светлые каналы с порогом QuantumRange; Перевести долю в целый порог для двух палитр.
Отметка доступности PHP.net: PECL gmagick >= Unknown. Unknown не задаёт известную минимальную версию. Наше окружение: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; фактические границы указаны выше.
Gmagick::swirlimageЗакрутить координаты вокруг центра
PECL gmagick >= Unknown · gmagick
Gmagick::swirlimage(float $degrees): GmagickЗакручивает пиксели вокруг центра изображения; обязательный float degrees задаёт угловой охват перемещения. PHP.net описывает усиление эффекта от 1 до 360 градусов. Возвращается Gmagick. В наших результатах 0 нейтрален, знаки−60/+60 дают противоположные изгибы. Это деформация, не жёсткий поворот и не круговое размытие. Ограничение модуля 90 в прикладном примере относится к дизайну обложки; метод не объявляется имеющим такой официальный диапазон. Чтобы сравнить варианты, каждый раз начинайте с исходного clone.
Gmagick::swirlimage(float $degrees): Gmagick| Параметр | Тип и обязательность | Смысл |
|---|---|---|
| $degrees | float; обязательный | Угловой охват закручивания в градусах. |
Официальная ошибка метода — GmagickException. Ошибка PHP-типа может быть TypeError; нарушение прикладного диапазона в наших функциях намеренно даёт InvalidArgumentException до библиотечного вызова. Эти прикладные ограничения не объявляются проверками самого расширения.
Два применения: Закрутить рисунок вокруг центра; Сделать парные обложки с противоположным изгибом.
Отметка доступности PHP.net: PECL gmagick >= Unknown. Unknown не задаёт известную минимальную версию. Наше окружение: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; фактические границы указаны выше.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


