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

Дерево руководства
Глава 405 · После переменных, объектов и файлов
Gmagick: первый файл, собственный холст и размеры
Создать PNG, открыть собственную картинку, измерить геометрию и различить ошибки чтения.
Создать первый PNG и прочитать его размеры
Каталогу нужен фон-заглушка для товара без фотографии. Начнём с полезного маленького результата: сохранённого PNG 320×200 выбранного цвета. Затем тот же объект поможет открыть настоящую картинку и подготовить варианты для сайта.

$image = new Gmagick();
$image->newImage(320, 200, "#244f65", "png");
$image->writeImage(__DIR__ . "/canvas.png");
echo $image->getImageWidth() . "x" . $image->getImageHeight();new создаёт объект-инструмент, $image — имя переменной, = сохраняет объект в ней. Стрелка -> обращается к его методу; круглые скобки содержат аргументы, запятые разделяют их. У newImage сначала ширина, затем высота, цвет и формат. #244f65 — строковая запись цвета. __DIR__ обозначает папку программы, точка соединяет строки пути. Последняя строка читает настоящие размеры и выводит 320x200. Пока на холсте только фон — не фотография и не файл из сети.
Создать первый PNG и прочитать его размеры
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick();
$result = $image->newImage(320,200,'#244f65','png');
$width = $image->getImageWidth();
$height = $image->getImageHeight();
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/canvas.png');
gmReport('gmagick-canvas',["__construct", "newimage", "getimagewidth", "getimageheight", "writeimage", "setimagedepth"],["canvas.png"],
['size'=>$width===320&&$height===200,'same_object'=>$result===$image],
$errors ?? [], []);
echo "canvas.png ".$width."x".$height." same-object=yes\n";
Ожидаемый результат
canvas.png 320x200 same-object=yes
Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.
Точный вывод успешного запуска
canvas.png 320x200 same-object=yes
В полном примере дополнительно проверено, что newImage вернул тот же объект. Такой результат позволяет вызывать методы цепочкой, но отдельные строки ясно показывают порядок. setImageDepth(8) перед записью задаёт глубину для переносимых PNG-превью; это не размер изображения. Файл metrics.json содержит фактические измерения, а не заменяет сам PNG.
Gmagick — PHP-расширение для GraphicsMagick. Это отдельный инструмент, а не новая версия Imagick; сходство названий не делает API взаимозаменяемым. Нужны и расширение PHP, и библиотека обработки. Быстрая проверка: extension_loaded("gmagick"), class_exists("Gmagick"), php -m в нужном CLI. Для веб-приложения проверяется также PHP-процесс веб-сервера: его настройки могут отличаться от командной строки.
Эти программы проверены в отдельном Linux runtime: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16. RC — предварительная версия; выбор окружения нужно зафиксировать. Локальная поставка использует изоляцию, потому что пакет Ubuntu php8.3-gmagick конфликтует с php-imagick; существующий Imagick не удалялся. Для своего проекта используйте отдельное окружение или контейнер и совместимые официальные пакеты. Наличие Windows PHP 8.5 само по себе не означает наличия совместимого Gmagick.
Перед продолжением полезны переменные, объекты и исключения. Каждый новый элемент текущего вызова пояснён выше; ссылки нужны для расширения основы. Для выбора другого инструмента сравните GD и ввод и вывод Imagick.
Открыть собственный рисунок по пути
Теперь у карточки есть собственный рисунок: объект в центре и красная/зелёная полоса по краям. Эти метки позже помогут увидеть обрезку. Прочитаем вход и сохраним его как PNG, чтобы открыть результат в браузере.

$image = new Gmagick();
$image->readImage(__DIR__ . "/product.ppm");
echo $image->getImageFormat(); // PPM
$image->setImageFormat("PNG");
$image->writeImage(__DIR__ . "/read-path.png");readImage получает путь и загружает файл в уже созданный объект. Исходник PPM — простой формат с размерами и RGB-байтами; для урока он создан нами без фотографии или чужого файла. getImageFormat читает текущее состояние. setImageFormat выбирает кодер будущей записи, writeImage создаёт PNG. Пока writeImage не вызван, смена формата не означает появления файла на диске.
Открыть собственный рисунок по пути
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick();
$result = $image->readImage(__DIR__.'/product.ppm');
$inputFormat = $image->getImageFormat();
$width = $image->getImageWidth();
$height = $image->getImageHeight();
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/read-path.png');
gmReport('gmagick-read-path',["__construct", "readimage", "getimageformat", "getimagewidth", "getimageheight", "setimageformat", "writeimage", "setimagedepth"],["read-path.png"],
['input_ppm'=>strtoupper($inputFormat)==='PPM','size'=>$width===320&&$height===200,'same_object'=>$result===$image],
$errors ?? [], []);
echo "read-path.png 320x200 input=PPM output=PNG\n";
Ожидаемый результат
read-path.png 320x200 input=PPM output=PNG
Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.
Точный вывод успешного запуска
read-path.png 320x200 input=PPM output=PNG
Полный архив содержит product.ppm.b64 и portrait.ppm.b64: helper проверяет контрольные суммы и восстанавливает обычные PPM рядом с программой. Base64 здесь нужен только для переносимого учебного архива. В собственном проекте вместо восстановления передайте путь к своему проверенному файлу. Геометрия 320×200 сохраняется.
Сравнить конструктор с отдельным чтением
Если файл уже известен, его можно открыть сразу при создании объекта. Сравним два равноправных способа на одинаковом входе, чтобы не путать пустой объект с прочитанным изображением.


$direct = new Gmagick(__DIR__ . "/product.ppm");
$separate = new Gmagick();
$separate->readImage(__DIR__ . "/product.ppm");
echo $direct->getImageWidth(); // 320
echo $separate->getImageWidth(); // 320В первой строке путь передан конструктору. Во второй объект пока пуст, а третья выполняет чтение. Это не два разных типа изображений: после чтения обе переменные содержат отдельные объекты с тем же рисунком. Разделённая запись удобна, когда путь определяется позже; короткая — когда он уже готов.
Сравнить конструктор с отдельным чтением
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$direct = new Gmagick(__DIR__.'/product.ppm');
$separate = new Gmagick();
$separate->readImage(__DIR__.'/product.ppm');
$direct->setImageFormat('PNG');
$direct->setImageDepth(8);
$direct->writeImage(__DIR__.'/constructor.png');
$separate->setImageFormat('PNG');
$separate->setImageDepth(8);
$separate->writeImage(__DIR__.'/separate-read.png');
$errors = ['array_path'=>gmTry(fn()=>new Gmagick([__DIR__.'/product.ppm']))];
gmReport('gmagick-constructor',["__construct", "readimage", "getimagewidth", "getimageheight", "setimageformat", "writeimage", "setimagedepth"],["constructor.png", "separate-read.png"],
['same_geometry'=>$direct->getImageWidth()===$separate->getImageWidth()&&$direct->getImageHeight()===$separate->getImageHeight(),'array_rejected'=>$errors['array_path']['class']==='TypeError'],
$errors ?? [], []);
echo "constructor.png separate-read.png 320x200 array-path=TypeError\n";
Ожидаемый результат
constructor.png separate-read.png 320x200 array-path=TypeError
Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.
Точный вывод успешного запуска
constructor.png separate-read.png 320x200 array-path=TypeError
У PHP.net есть противоречие: пояснение конструктора упоминает массив путей, сигнатура — строку. Настоящий запуск этой версии отверг массив с TypeError. Поэтому пример с массивом служит явно пойманной ошибкой совместимости, а два нормальных пути используют строки. Ни один успех здесь не подтверждает поддержку произвольного списка файлов.
Отличить ширину от высоты и выбрать рамку
Одна сетка каталога получает альбомные и портретные изображения. До уменьшения полезно узнать их стороны и объяснить человеку, какой вариант получится.


$image = new Gmagick(__DIR__ . "/portrait.ppm");
$width = $image->getImageWidth();
$height = $image->getImageHeight();
echo $width . "x" . $height; // 200x320getImageWidth возвращает число столбцов, getImageHeight — число строк. Оба результата int: их можно сравнивать и использовать в расчёте. Пустые скобки означают, что аргументы не требуются: изображение уже хранится в объекте. Пиксели задают геометрию; байты файла зависят ещё и от формата, сжатия и дополнительных данных.
Отличить ширину от высоты и выбрать рамку
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$landscape = new Gmagick(__DIR__.'/product.ppm');
$portrait = new Gmagick(__DIR__.'/portrait.ppm');
$sizes = [];
foreach (['landscape'=>$landscape,'portrait'=>$portrait] as $name=>$image) {
$width = $image->getImageWidth();
$height = $image->getImageHeight();
$sizes[$name] = ['width'=>$width,'height'=>$height,'orientation'=>$width>$height?'landscape':'portrait'];
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/'.$name.'.png');
}
gmReport('gmagick-orientation',["__construct", "getimagewidth", "getimageheight", "setimageformat", "writeimage", "setimagedepth"],["landscape.png", "portrait.png"],
['landscape'=>$sizes['landscape']['width']===320&&$sizes['landscape']['height']===200,'portrait'=>$sizes['portrait']['width']===200&&$sizes['portrait']['height']===320],
$errors ?? [], $sizes);
echo "landscape.png 320x200 portrait.png 200x320\n";
Ожидаемый результат
landscape.png 320x200 portrait.png 200x320
Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.
Точный вывод успешного запуска
landscape.png 320x200 portrait.png 200x320
Полная программа обрабатывает два изображения через foreach: в каждой итерации имя и объект присваиваются переменным. Условие width>height выбирает подпись. Для квадратного входа потребуется третья подпись, если интерфейс должен его различать; здесь оба собственных входа прямоугольные. Они сохраняются в натуральных размерах 320×200 и 200×320.
Сохранить хороший вход и объяснить три разных отказа
Хороший обработчик различает отсутствующий файл, неподходящее содержимое и попытку измерить пустой объект. Покажем эти три отказа, затем сохраним правильный вход.

try {
$image = new Gmagick();
$image->readImage(__DIR__ . "/missing.png");
} catch (GmagickException $error) {
echo "Файл изображения не прочитан";
}try содержит действие, которое может завершиться исключением. catch получает объект ошибки и выбирает понятный ответ. Это не просьба подавлять любые ошибки: нужный файл так и не появился, задача чтения не выполнена. Не продолжайте обработку пустого объекта как будто загрузка удалась.
Сохранить хороший вход и объяснить три разных отказа
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
file_put_contents(__DIR__.'/broken.dat','This is not an image');
$errors = [
'missing'=>gmTry(fn()=>(new Gmagick())->readImage(__DIR__.'/missing.png')),
'broken'=>gmTry(fn()=>(new Gmagick())->readImage(__DIR__.'/broken.dat')),
'empty_width'=>gmTry(fn()=>(new Gmagick())->getImageWidth()),
];
$image = new Gmagick();
$image->readImage(__DIR__.'/product.ppm');
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/valid-input.png');
gmReport('gmagick-read-errors',["__construct", "readimage", "getimagewidth", "setimageformat", "writeimage", "setimagedepth"],["valid-input.png"],
['three_caught'=>count(array_filter($errors,fn($e)=>($e['class']??null)==='GmagickException'))===3],
$errors ?? [], []);
echo "valid-input.png errors=missing,broken,empty-width caught=3\n";
Ожидаемый результат
valid-input.png errors=missing,broken,empty-width caught=3
Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.
Точный вывод успешного запуска
valid-input.png errors=missing,broken,empty-width caught=3
Полная программа создаёт собственный broken.dat с обычным текстом. Все три случая дали GmagickException; их сообщения сохранены в диагностике. Запись valid-input.png доказывает отдельно выполненный успешный путь. Для реального пользовательского ввода дополнительно нужны допустимые типы, размеры и пути; само чтение картинки не заменяет весь обработчик загрузки.
Из реальных вопросов разработчиков
load Gmagick class from wrong namespace: Класс Gmagick не найден, хотя код использует глобальное пространство имён. Отделяем наличие расширения в нужном PHP-процессе от синтаксиса namespace; проверяем extension_loaded и class_exists.
how to install gmagick extension of php on windows vista: На Windows непонятно, как согласовать расширение, версию PHP и путь к изображению. Фиксируем проверенную изолированную среду, открываем конкретный файл через __DIR__; не повторяем ошибочное отождествление Gmagick с новой версией ImageMagick.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::__constructСоздать объект и при необходимости открыть файл
PECL gmagick >= Unknown · gmagick
Gmagick::__construct(string $filename = ?): voidGmagick::__construct(string $filename = ?): voidНеобязательный filename — путь к файлу. Без него создаётся пустой объект, которому ещё нужно изображение. Конструктор не является методом преобразования и не возвращает цепочку вызовов: выражение new создаёт объект. В описании PHP.net упомянут также массив путей, но сигнатура показывает string. Проверенный runtime принимает ?string; массив действительно вызвал TypeError. Для этих уроков передаём один путь либо не передаём аргумент.
| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $filename | string; необязательный | Имя файла; его конкретная роль объяснена ниже. |
Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.
Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.
Два различных применения: Сравнить конструктор с отдельным чтением; Отличить ширину от высоты и выбрать рамку. В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.
Gmagick::getimageformatПрочитать формат текущего изображения
PECL gmagick >= Unknown · gmagick
Gmagick::getimageformat(): stringGmagick::getimageformat(): stringАргументов нет. Возвращается строка формата конкретного изображения в последовательности. Это не разбор расширения имени файла. На новом холсте встречается png, после записи PNG — PNG; у JPEG в объекте записи наблюдалось JPG, а после чтения файла — JPEG. Регистр можно нормализовать, но JPG и JPEG остаются разными строковыми обозначениями одного семейства.
Параметров нет: вызов записывается с пустыми круглыми скобками.
Официальный результат: string — строка формата.
Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.
Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.
Два различных применения: Открыть собственный рисунок по пути; Проверить формат по содержимому и повторному чтению. В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.
Gmagick::getimageheightПрочитать высоту текущего изображения
PECL gmagick >= Unknown · gmagick
Gmagick::getimageheight(): intGmagick::getimageheight(): intАргументов нет. Результат int — высота изображения в пикселях. Это число строк растра. Пара ширина/высота позволяет отличить портретный вход от альбомного и проверить результат обработки. Для пустого объекта нельзя подставлять ноль вместо ошибки чтения состояния.
Параметров нет: вызов записывается с пустыми круглыми скобками.
Официальный результат: int — целое число пикселей.
Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.
Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.
Два различных применения: Создать первый PNG и прочитать его размеры; Отличить ширину от высоты и выбрать рамку. В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.
Gmagick::getimagewidthПрочитать ширину текущего изображения
PECL gmagick >= Unknown · gmagick
Gmagick::getimagewidth(): intGmagick::getimagewidth(): intАргументов нет. Результат int — ширина изображения в пикселях. Это число столбцов растра, а не байты файла и не размер CSS-блока. После изменения геометрии читается новая ширина текущего изображения. На пустом Gmagick реальная проверка дала GmagickException.
Параметров нет: вызов записывается с пустыми круглыми скобками.
Официальный результат: int — целое число пикселей.
Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.
Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.
Два различных применения: Создать первый PNG и прочитать его размеры; Отличить ширину от высоты и выбрать рамку. В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.
Gmagick::newimageСоздать холст заданного размера и цвета
PECL gmagick >= Unknown · gmagick
Gmagick::newimage(int $width, int $height, string $background, string $format = ?): GmagickGmagick::newimage(int $width, int $height, string $background, string $format = ?): Gmagickwidth и height — целые стороны в пикселях; background — строка цвета; format — необязательное имя формата. Результат — объект Gmagick. В проверенном вызове возвращён тот же объект, что позволяет цепочки, но новичку проще читать отдельные строки. Противоречивое «as float» в пояснении background на PHP.net не меняет строковую сигнатуру; здесь передаётся #244f65. Формат задаём явно, чтобы далее получить PNG.
| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $width | int; обязательный | Ширина в пикселях. |
| $height | int; обязательный | Высота в пикселях. |
| $background | string; обязательный | Строковое описание цвета фона. |
| $format | string; необязательный | Необязательное имя формата нового изображения. |
Официальный результат: объект Gmagick. Методы обработки изменяют состояние объекта; для независимого результата используйте clone.
Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.
Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.
Два различных применения: Создать первый PNG и прочитать его размеры; Сделать явную политику «не увеличивать». В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.
Gmagick::readimageЗагрузить изображение по имени файла
PECL gmagick >= Unknown · gmagick
Gmagick::readimage(string $filename): GmagickGmagick::readimage(string $filename): Gmagickfilename — обязательная строка с именем файла. Возвращается Gmagick; это чтение данных в объект, а не возврат бинарной строки. Путь к папке, отсутствующий путь и неподдерживаемое содержимое не становятся изображением из-за имени переменной. Собственный вход открываем через __DIR__. Ошибки отсутствующего и повреждённого файла в примере перехвачены отдельно.
| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $filename | string; обязательный | Имя файла; его конкретная роль объяснена ниже. |
Официальный результат: объект Gmagick. Методы обработки изменяют состояние объекта; для независимого результата используйте clone.
Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.
Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.
Два различных применения: Открыть собственный рисунок по пути; Сохранить хороший вход и объяснить три разных отказа. В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


