Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

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

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 332 · После первой фигуры

ImagickDraw: создание, копирование, очистка и стек состояния

Шесть API: от первого объекта команд до отчёта из независимых копий; Draw против растра, общий объект при присваивании, clear/destroy alias, push/pop и границы отмены.

Настройки и команды — отдельно от готовых пикселей

Сервис собирает отчёт из карточек: одна временно оранжевая, остальные используют общую тему. Нужно не переносить чужой стиль в следующий компонент, не рисовать прежний слой второй раз и не потерять уже готовую картинку при очистке. Для этого различаем объект команд Draw, его настройки/стек и растровый $image.

$draw хранит настройки и rectangle(30,30,210,150); до drawImage белый $image, после применения — мятная карточка. New и запись команды сами ещё не изменяют пиксели
$draw хранит настройки и rectangle(30,30,210,150); до drawImage белый $image, после применения — мятная карточка. New и запись команды сами ещё не изменяют пиксели Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.

Начнём с создания объекта и одного видимого результата. Затем отделим общее имя от копии, очистку очереди от очистки растра и push/pop от отмены рисунка. Предварительные понятия: прямоугольник и круг, заливка, локальные координаты.

Две картинки из одной очереди: до и после применения

Увидеть момент появления фигурыПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->rectangle(30, 30, 210, 150);
if (!$image->writeImage(__DIR__ . '/before-draw.png')) {
    throw new RuntimeException('Не удалось сохранить исходный холст');
}
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/after-draw.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'after-draw.png', "\n";
$image->clear();

При успехе создаются before-draw.png и after-draw.png, оба 240×180. Первый полностью белый: new Draw и rectangle только подготовили команды. Второй содержит мятную карточку (30,30)—(210,150) с бирюзовым краем. Очистка Draw после drawImage её не стёрла. Консоль — after-draw.png; это единственное имя, которое программа печатает.

ЗаписьЧто произошло
new ImagickDraw()Создан объект команд; выражение new вернуло его в переменную
setFillColor / rectangleЗаписаны настройки и фигура, PNG ещё не изменён
$image->drawImage($draw)Команды нанесены на растровый холст; очередь Draw не расходуется автоматически
$draw->clear()Удалена очередь и сброшены настройки, пиксели $image сохранены
writeImageРастр сохранён в файл

$draw — переменная, -> вызывает метод объекта, скобки содержат аргументы, ; завершает инструкцию. new создаёт объект, а не запускает весь будущий рисунок. if (!$image->writeImage(...)) сообщает об отказе записи; это отдельная проверка сохранения, не часть механизма Draw. Подробнее — объект и метод.

Присваивание даёт второе имя, clone — независимую копию

Слева $alias=$base: два имени одного Draw, обе карточки оранжевые. Справа свежая тема и её копия: базовая карточка мятная, вариант оранжевый
Слева $alias=$base: два имени одного Draw, обе карточки оранжевые. Справа свежая тема и её копия: базовая карточка мятная, вариант оранжевый Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.
Сравнить общий объект и современную копиюПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(600, 180, 'white');
$image->setImageFormat('png');
$base = new ImagickDraw();
$base->setStrokeColor('#146c74');
$base->setStrokeWidth(4);
$base->setFillColor('#bdebe2');
$alias = $base;
$alias->setFillColor('#c25732');
$base->rectangle(20, 30, 120, 130);
$alias->rectangle(160, 30, 260, 130);
$image->drawImage($base);
echo 'assignment-same=', $base === $alias ? 'yes' : 'no', "\n";
$base->clear();
unset($alias, $base);
$theme = new ImagickDraw();
$theme->setStrokeColor('#146c74');
$theme->setStrokeWidth(4);
$theme->setFillColor('#bdebe2');
$copy = clone $theme;
$copy->setFillColor('#c25732');
$theme->rectangle(320, 30, 420, 130);
$copy->rectangle(460, 30, 560, 130);
$image->drawImage($theme);
$image->drawImage($copy);
echo 'clone-same=', $theme === $copy ? 'yes' : 'no', "\n";
$theme->clear();
$copy->clear();
$path = __DIR__ . '/assignment-vs-clone.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'assignment-vs-clone.png', "\n";
$image->clear();

При успехе assignment-vs-clone.png 600×180 содержит четыре карточки: оранжевая, оранжевая, мятная, оранжевая. Консоль перед именем файла: assignment-same=yes, затем clone-same=no. Обычное = копирует идентификатор объекта, не его native DrawingWand. Это не то же самое, что PHP-присваивание по ссылке через &: две переменные могут независимо переприсваиваться, сохраняя доступ к одному прежнему объекту.

clone $theme — оператор языка; $theme->clone() — исторический метод расширения. Первый используется в новом коде этой главы, второй полностью разобран в своей официальной карточке с предупреждением текущего binding. === для объектов проверяет, один ли это объект. См. копирование объектов.

Стек меняет будущую тему, а не стирает прошлые команды

Основная мятная тема → push → локальная оранжевая тема → pop → мятная тема. Настройки/CTM возвращаются, все три rectangle остаются в очереди
Основная мятная тема → push → локальная оранжевая тема → pop → мятная тема. Настройки/CTM возвращаются, все три rectangle остаются в очереди Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.

Стек похож на стопку сохранённых настроек: последнее сохранение берём первым. Это аналогия состояния, а не буквальная стопка PNG. Push не выдаёт новую PHP-переменную, pop не является undo, а слово destroys в кратком Manual pop относится к внутреннему контексту, не к удалению $draw. Базовый рисунок с тремя карточками показан в обеих парных карточках push/pop.

Отчёт из общей темы с локальными статусами

Нужно три карточки с одним оформлением и разными статусами. Общая тема ещё не содержит геометрию; каждая современная копия получает свою очередь. Внешний push/pop ограничивает перенос, внутренний — цвет статуса. Обе пары сбалансированы через finally. После подготовки карточка применяется к изображению один раз и очищается.

PNG 640×320: три мятные карточки с сиреневым/персиковым/сиреневым статусом. В каждой две бирюзовые строки; цвета и координаты соседних компонентов изолированы
PNG 640×320: три мятные карточки с сиреневым/персиковым/сиреневым статусом. В каждой две бирюзовые строки; цвета и координаты соседних компонентов изолированы Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.
Собрать карточки, сохранив границы их состоянияПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(640, 320, 'white');
$image->setImageFormat('png');
$template = new ImagickDraw();
$template->setStrokeColor('#146c74');
$template->setStrokeWidth(4);
$template->setFillColor('#bdebe2');
foreach ([40, 240, 440] as $index => $x) {
    $card = clone $template;
    $card->push();
    try {
        $card->translate($x, 60);
        $card->rectangle(0, 0, 160, 200);
        $card->push();
        try {
            $card->setFillColor($index === 1 ? '#f1c6b7' : '#c5cee8');
            $card->rectangle(105, 15, 145, 55);
        } finally {
            $card->pop();
        }
        $card->line(20, 80, 140, 80);
        $card->line(20, 110, 100, 110);
    } finally {
        $card->pop();
    }
    $image->drawImage($card);
    $card->clear();
    unset($card);
}
$template->clear();
unset($template);
$path = __DIR__ . '/state-report.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'state-report.png', "\n";
$image->clear();

При успехе state-report.png 640×320 содержит карточки с верхними левыми углами (40,60), (240,60), (440,60), каждая 160×200 в локальных координатах. Статус расположен в (105,15)—(145,55) каждой карточки, две строки — на локальных y=80 и y=110. Копии создаются из темы без геометрии, поэтому предыдущие карточки не рисуются повторно. Консоль — state-report.png.

Упражнение: замените цвет только среднего статуса на #c25732 — соседние статусы должны остаться сиреневыми. Затем добавьте временную translate внутри внутренней области статуса: после её pop строки должны сохранить свои исходные координаты. Если весь компонент нужно отменить при ошибке, не применяйте его копию к $image до успешного завершения; pop не удалит частично записанные команды.

Сохранить правильные границы ответственности

  • New создаёт объект команд, rectangle записывает геометрию, drawImage наносит очередь на растр, writeImage сохраняет файл. Это четыре разных шага.
  • Присваивание второго имени не копирует Draw. Clone копирует также накопленные команды; для общей темы копируйте до их записи.
  • Clear сбрасывает Draw, но не пиксели $image. Destroy в проверенном binding — alias clear; его не следует называть deprecated или «навсегда убивающим объект» без отдельного источника версии.
  • Push/pop сохраняют и возвращают состояние, а не снимок картинки. В finally возвращайте только то состояние, которое было успешно сохранено.
  • При HTTP-выводе PNG предупреждение deprecated от исторического clone() или посторонний echo испортят ответ. В новом коде используйте оператор clone и завершайте обработку ошибок до отправки изображения.

Следующий шаг — применять локальные темы вместе с координатными преобразованиями и заливкой составных контуров. Остальные API ImagickDraw остаются отдельными узлами полного справочника; этот блок их не подменяет.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

ImagickDraw::__constructНужно подготовить фигуру для отчёта. Сначала нужен объект, который хранит команды и настройки; сам он ещё не является ни холстом, ни файлом.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::__construct(): void

Нужно подготовить фигуру для отчёта. Сначала нужен объект, который хранит команды и настройки; сам он ещё не является ни холстом, ни файлом.

Выражение new ImagickDraw() создаёт отдельный объект и вызывает конструктор без аргументов. Результат выражения new сохраняется в переменную; сам __construct имеет void и не возвращает изображение. Цвет, толщина и геометрия назначаются следующими методами, а drawImage применяет их к отдельному Imagick.

Синтаксис, вход и результат

ImagickDraw::__construct(): void

У этого API нет аргументов. Вызов относится к конкретному Draw и его состоянию. У __construct — void. Не вызывайте его вручную для очистки существующего Draw: конструктор не является clear, а текущая C-функция не выполняет сброс очереди. $draw = new ImagickDraw() получает объект от операции new.

Доступность по официальному snapshot: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в нём пусты. Для clone статус текущей реализации оговорён отдельно по C-коду, для destroy отдельно проверен alias. Номер первой версии изменения без подтверждения не указан. Программы используют PHP 8.2+ и требуют imagick.

Ошибки в raw-страницах отдельно не расписаны. Создание/копирование может отказать из-за ресурсов, неправильная работа со стеком приводит к ImagickDrawException; растеризация/сохранение могут завершиться ImagickException либо false. Нативные примеры здесь ещё не выполнены: успешный lint не доказывает установленное расширение, возврат API или доступность каталога. Не подавляйте предупреждения перед HTTP-выводом картинки: сначала завершите подготовку и обработку ошибок.

Полный сохранённый контракт PHP Manual

Все поля snapshot оставлены неизменными, включая противоречивые return-тексты: описание, параметры, версии, changelog, see-also, сведения о примерах и hashes. Разъяснение актуального binding дано отдельно, не подменяет исходную запись.

{
  "id": "imagickdraw.construct",
  "name": "ImagickDraw::__construct",
  "purpose_en": "The ImagickDraw constructor",
  "description_en": "The ImagickDraw constructor.",
  "signature": "ImagickDraw::__construct(): void",
  "modifiers": [
    "public"
  ],
  "return_type": "void",
  "parameters": [],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.construct.php",
  "official_page_sha256": "7190c800409e1eae8b4d75150adbc63fc98251222b7ffad80b1bb715ebc6142f",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/construct.xml",
  "xml_sha256": "c32012fe382395a09a8c9e4da8e1cba5ca20b6fd3f2d93cc0de4a56e5f0bfe18",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Создать объект команд: пояснение границы объекта, очереди и состояния
Создать объект команд: пояснение границы объекта, очереди и состояния Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.
Создать объект команд: минимальный результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->rectangle(30, 30, 210, 150);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/constructor-card.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'constructor-card.png', "\n";
$image->clear();

При успешном выполнении создаётся constructor-card.png 240×180. Мятная карточка (30,30)—(210,150), бирюзовый край толщиной 4 на белом холсте. new создал Draw; только rectangle записал фигуру, drawImage нанёс её на изображение. Последняя строка — constructor-card.png.

Практическая задача: Отдельные Draw для сетки и карточки

Сетка и карточка имеют разные цвета и назначение. Создадим независимые объекты команд, чтобы толщина и заливка карточки не попали в оформление сетки.

Отдельные Draw для сетки и карточкиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 200, 'white');
$image->setImageFormat('png');
$grid = new ImagickDraw();
$grid->setStrokeColor('#d6e1df');
$grid->setStrokeWidth(1);
$grid->setFillColor('none');
foreach ([40, 80, 120, 160] as $y) {
    $grid->line(10, $y, 310, $y);
}
$image->drawImage($grid);
$grid->clear();
$card = new ImagickDraw();
$card->setStrokeColor('#146c74');
$card->setStrokeWidth(4);
$card->setFillColor('#bdebe2');
$card->rectangle(60, 30, 260, 150);
$card->line(80, 70, 240, 70);
$card->line(80, 110, 190, 110);
$image->drawImage($card);
$card->clear();
unset($grid, $card);
$path = __DIR__ . '/separate-components.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'separate-components.png', "\n";
$image->clear();

Результат: separate-components.png 320×200. Серая сетка видна в полях, поверх неё лежит непрозрачная мятная карточка с двумя бирюзовыми строками. Карточка не изменила состояние сетки, потому что new создал второй Draw; применение каждого объекта выполнено отдельно. Последняя строка — separate-components.png.

Ошибки, альтернативы и стоимость

Один new не рисует прямоугольник и не сохраняет PNG. Два вызова new создают независимые очереди; обычное $alias=$draw — второе имя того же объекта. Не путайте создание Draw с newImage, которое создаёт растровый холст.

Копия и сохранённые контексты требуют дополнительных ресурсов. Стоимость растёт с очередью команд и связанными настройками; не клонируйте большую подготовленную очередь ради одного цвета, если достаточно пустого шаблона или локального push/pop. В длительной задаче очищайте временный Draw после применения, не удерживайте ненужные копии в массивах и проверяйте полный процесс. Не обещайте, что clear/destroy немедленно снизят RSS: кеши, native allocator и жизненный цикл PHP-процесса тоже участвуют.

В практических программах foreach обходит компоненты, try/finally гарантирует попытку возврата состояния, catch обрабатывает демонстрационный отказ, unset отпускает имя переменной. Это разные операции. См. условия и циклы, исключения, копирование.

Связанные API: ImagickDraw::clone · ImagickDraw::clear · ImagickDraw::destroy · ImagickDraw::push · ImagickDraw::pop. Переходы: заливка, локальные оси и CTM.

ImagickDraw::cloneИз общей темы нужно получить независимый вариант: смена его цвета не должна менять базовый объект, а подготовленная очередь должна копироваться осознанно.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::clone(): ImagickDraw

Из общей темы нужно получить независимый вариант: смена его цвета не должна менять базовый объект, а подготовленная очередь должна копироваться осознанно.

Исторический метод $copy=$base->clone() возвращает отдельный ImagickDraw с копией native DrawingWand, включая команды и настройки. В новом коде используйте оператор $copy=clone $base: текущий Imagick handler также клонирует DrawingWand. Простое $copy=$base не создаёт эту независимость.

Синтаксис, вход и результат

ImagickDraw::clone(): ImagickDraw

У этого API нет аргументов. Вызов относится к конкретному Draw и его состоянию. ImagickDraw — отдельный объект, а не bool. Текущий C-код метода clone() вызывает IMAGICK_METHOD_DEPRECATED; у сохранённой страницы PHP Manual такого маркера нет. Эти факты сохранены раздельно: не выдумываем номер первой deprecated-версии. Современный путь — оператор clone без скобок метода. Исторические два примера ниже могут дополнительно вывести E_DEPRECATED; пользовательский обработчик способен превратить его в исключение.

Доступность по официальному snapshot: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в нём пусты. Для clone статус текущей реализации оговорён отдельно по C-коду, для destroy отдельно проверен alias. Номер первой версии изменения без подтверждения не указан. Программы используют PHP 8.2+ и требуют imagick.

Ошибки в raw-страницах отдельно не расписаны. Создание/копирование может отказать из-за ресурсов, неправильная работа со стеком приводит к ImagickDrawException; растеризация/сохранение могут завершиться ImagickException либо false. Нативные примеры здесь ещё не выполнены: успешный lint не доказывает установленное расширение, возврат API или доступность каталога. Не подавляйте предупреждения перед HTTP-выводом картинки: сначала завершите подготовку и обработку ошибок.

Полный сохранённый контракт PHP Manual

Все поля snapshot оставлены неизменными, включая противоречивые return-тексты: описание, параметры, версии, changelog, see-also, сведения о примерах и hashes. Разъяснение актуального binding дано отдельно, не подменяет исходную запись.

{
  "id": "imagickdraw.clone",
  "name": "ImagickDraw::clone",
  "purpose_en": "Makes an exact copy of the specified ImagickDraw object",
  "description_en": "Makes an exact copy of the specified ImagickDraw object.",
  "signature": "ImagickDraw::clone(): ImagickDraw",
  "modifiers": [
    "public"
  ],
  "return_type": "ImagickDraw",
  "parameters": [],
  "return_en": "returns an exact copy of the specified ImagickDraw object.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.clone.php",
  "official_page_sha256": "3e46ff840eaf7cbe23e2b7b928ed419f306f0efc08ac8d1b0148d872779f994f",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/clone.xml",
  "xml_sha256": "98fb8dddaf5c4fda890a051e02f5e6d08eb1b2c9d89df66ad31ff140878e755f",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Скопировать команды и настройки: пояснение границы объекта, очереди и состояния
Скопировать команды и настройки: пояснение границы объекта, очереди и состояния Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.
Скопировать команды и настройки: минимальный результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(300, 180, 'white');
$image->setImageFormat('png');
$base = new ImagickDraw();
$base->setStrokeColor('#146c74');
$base->setStrokeWidth(4);
$base->setFillColor('#bdebe2');
$copy = $base->clone(); // Исторический метод; в новом коде: $copy = clone $base;
$copy->setFillColor('#c25732');
$base->rectangle(20, 30, 120, 130);
$copy->rectangle(160, 30, 260, 130);
$image->drawImage($base);
$image->drawImage($copy);
echo 'same-object=', $base === $copy ? 'yes' : 'no', "\n";
$base->clear();
$copy->clear();
$path = __DIR__ . '/independent-copy.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'independent-copy.png', "\n";
$image->clear();

При успешном выполнении создаётся independent-copy.png 300×180. Слева мятная карточка, справа оранжевая. База клонирована до записи фигур, поэтому каждая очередь содержит только свою карточку. === сравнивает идентичность объектов, а не сходство рисунков. В текущем binding метод clone() помечен deprecated; он может дополнительно выдать E_DEPRECATED в зависимости от настройки диагностики. Перед именем файла консоль: same-object=no. Последняя строка — independent-copy.png.

Практическая задача: Сохранить подготовленные команды и добавить вариант

Экспортёр уже записал карточку, но ещё не нанёс её на изображение. Копия должна получить и настройки, и эту очередь; добавим к копии круг статуса и применим её ровно один раз.

Сохранить подготовленные команды и добавить вариантПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 180, 'white');
$image->setImageFormat('png');
$base = new ImagickDraw();
$base->setStrokeColor('#146c74');
$base->setStrokeWidth(4);
$base->setFillColor('#bdebe2');
$base->rectangle(20, 30, 120, 130);
$copy = $base->clone(); // Исторический API; современная запись: $copy = clone $base;
$copy->setFillColor('#f1c6b7');
$copy->circle(210, 80, 245, 80);
$image->drawImage($copy);
$base->clear();
$copy->clear();
unset($base, $copy);
$path = __DIR__ . '/copied-commands.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-commands.png', "\n";
$image->clear();

Результат: copied-commands.png 280×180. Мятная карточка слева и персиковый круг справа. Rectangle пришёл в копию вместе с записанной очередью; круг добавлен после копирования. Исходную базу отдельно не применяем: иначе её команды могли бы повторно наложиться, что особенно заметно с opacity. Возможен E_DEPRECATED от исторического clone() в дополнение к имени файла. Последняя строка — copied-commands.png.

Ошибки, альтернативы и стоимость

Копируются не только цвета. Если в базе уже записан rectangle, копия тоже его содержит; повторное применение базы и копии может дважды наложить один полупрозрачный слой. Для шаблона стилей копируйте до записи геометрии. Сходство объекта через == не заменяет проверку идентичности ===. Обычные вложенные PHP-свойства подчиняются правилам PHP clone; не обобщайте native DrawingWand-копирование на любые чужие объекты.

Копия и сохранённые контексты требуют дополнительных ресурсов. Стоимость растёт с очередью команд и связанными настройками; не клонируйте большую подготовленную очередь ради одного цвета, если достаточно пустого шаблона или локального push/pop. В длительной задаче очищайте временный Draw после применения, не удерживайте ненужные копии в массивах и проверяйте полный процесс. Не обещайте, что clear/destroy немедленно снизят RSS: кеши, native allocator и жизненный цикл PHP-процесса тоже участвуют.

В практических программах foreach обходит компоненты, try/finally гарантирует попытку возврата состояния, catch обрабатывает демонстрационный отказ, unset отпускает имя переменной. Это разные операции. См. условия и циклы, исключения, копирование.

Связанные API: ImagickDraw::__construct · ImagickDraw::clear · ImagickDraw::destroy · ImagickDraw::push · ImagickDraw::pop. Переходы: заливка, локальные оси и CTM.

ImagickDraw::clearЧерновик фигуры отменён до растеризации или Draw нужно использовать для следующего компонента. Старые команды и временная тема больше не должны участвовать в следующем drawImage.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::clear(): bool

Черновик фигуры отменён до растеризации или Draw нужно использовать для следующего компонента. Старые команды и временная тема больше не должны участвовать в следующем drawImage.

Clear очищает накопленные команды и сбрасывает настройки Draw к значениям по умолчанию. Это изменение объекта команд, не очистка пикселей уже существующего $image. После clear задавайте нужные цвета, толщину и преобразование заново, не рассчитывая на прошлую тему.

Синтаксис, вход и результат

ImagickDraw::clear(): bool

У этого API нет аргументов. Вызов относится к конкретному Draw и его состоянию. bool: текущий wrapper вызывает ClearDrawingWand и возвращает true. Текст Return Values в сохранённом Manual ошибочно говорит об ImagickDraw; его raw-контракт не исправлен молча, а расхождение объяснено здесь. Не пишите $draw=$draw->clear(): так в переменную попадёт bool вместо объекта.

Доступность по официальному snapshot: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в нём пусты. Для clone статус текущей реализации оговорён отдельно по C-коду, для destroy отдельно проверен alias. Номер первой версии изменения без подтверждения не указан. Программы используют PHP 8.2+ и требуют imagick.

Ошибки в raw-страницах отдельно не расписаны. Создание/копирование может отказать из-за ресурсов, неправильная работа со стеком приводит к ImagickDrawException; растеризация/сохранение могут завершиться ImagickException либо false. Нативные примеры здесь ещё не выполнены: успешный lint не доказывает установленное расширение, возврат API или доступность каталога. Не подавляйте предупреждения перед HTTP-выводом картинки: сначала завершите подготовку и обработку ошибок.

Полный сохранённый контракт PHP Manual

Все поля snapshot оставлены неизменными, включая противоречивые return-тексты: описание, параметры, версии, changelog, see-also, сведения о примерах и hashes. Разъяснение актуального binding дано отдельно, не подменяет исходную запись.

{
  "id": "imagickdraw.clear",
  "name": "ImagickDraw::clear",
  "purpose_en": "Clears the ImagickDraw",
  "description_en": "Clears the ImagickDraw object of any accumulated commands, and resets the settings it contains to their defaults.",
  "signature": "ImagickDraw::clear(): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [],
  "return_en": "Returns an ImagickDraw object.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.clear.php",
  "official_page_sha256": "7cca7ed8e08e7ef5d854fd6587dd8b7de682916233ab18238396ea93e429315b",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/clear.xml",
  "xml_sha256": "604acbbda715bb5ac1ef93c8989f1d84932f9bbee1c2b19da3bdcd631c89e513",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Очистить очередь и вернуть настройки: пояснение границы объекта, очереди и состояния
Очистить очередь и вернуть настройки: пояснение границы объекта, очереди и состояния Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.
Очистить очередь и вернуть настройки: минимальный результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->rectangle(20, 30, 120, 130);
$ok = $draw->clear();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#f1c6b7');
$draw->circle(210, 80, 245, 80);
$image->drawImage($draw);
echo 'clear=', $ok ? 'true' : 'false', '; type=', get_debug_type($ok), "\n";
$draw->clear();
$path = __DIR__ . '/cancelled-draft.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'cancelled-draft.png', "\n";
$image->clear();

При успешном выполнении создаётся cancelled-draft.png 280×180. Остаётся только персиковый круг с центром (210,80), радиусом 35 и бирюзовым краем. Мятный rectangle был удалён из очереди до её применения. После clear цвет и толщина заданы заново: прежние настройки тоже сброшены. Перед именем файла консоль: clear=true; type=bool. Последняя строка — cancelled-draft.png.

Практическая задача: Начать следующую очередь, сохранив уже нанесённый слой

Первый компонент уже попал в картинку. Для следующего переиспользуем Draw после clear, а не накладываем заново старые команды вместе с новыми.

Начать следующую очередь, сохранив уже нанесённый слойПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->rectangle(20, 30, 120, 130);
$image->drawImage($draw);
$draw->clear();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#f1c6b7');
$draw->circle(210, 80, 245, 80);
$image->drawImage($draw);
$draw->clear();
unset($draw);
$path = __DIR__ . '/raster-survives-clear.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'raster-survives-clear.png', "\n";
$image->clear();

Результат: raster-survives-clear.png 280×180. На PNG остаются обе фигуры: мятный rectangle и персиковый круг. Первый уже стал пикселями $image до clear. При втором drawImage применяется только круг; clear не очищает растровый холст и не является undo. Последняя строка — raster-survives-clear.png.

После первого drawImage мятный rectangle уже находится на $image. Clear очищает Draw, затем добавленный персиковый круг появляется рядом; rectangle остаётся
После первого drawImage мятный rectangle уже находится на $image. Clear очищает Draw, затем добавленный персиковый круг появляется рядом; rectangle остаётся Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.

Ошибки, альтернативы и стоимость

drawImage не расходует очередь автоматически. Если добавить новую команду и применить тот же Draw снова без clear, прежние команды тоже применятся повторно. Clear после drawImage не отменяет уже нанесённые пиксели. После reset старый стек push/pop тоже не следует продолжать; новый компонент начинает сбалансированную историю заново.

Копия и сохранённые контексты требуют дополнительных ресурсов. Стоимость растёт с очередью команд и связанными настройками; не клонируйте большую подготовленную очередь ради одного цвета, если достаточно пустого шаблона или локального push/pop. В длительной задаче очищайте временный Draw после применения, не удерживайте ненужные копии в массивах и проверяйте полный процесс. Не обещайте, что clear/destroy немедленно снизят RSS: кеши, native allocator и жизненный цикл PHP-процесса тоже участвуют.

В практических программах foreach обходит компоненты, try/finally гарантирует попытку возврата состояния, catch обрабатывает демонстрационный отказ, unset отпускает имя переменной. Это разные операции. См. условия и циклы, исключения, копирование.

Связанные API: ImagickDraw::__construct · ImagickDraw::clone · ImagickDraw::destroy · ImagickDraw::push · ImagickDraw::pop. Переходы: заливка, локальные оси и CTM.

ImagickDraw::destroyВ старом примере после drawImage встретился destroy. Нужно понять, очистит ли он картинку, удалит ли PHP-переменную и нужен ли дополнительный clear.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::destroy(): bool

В старом примере после drawImage встретился destroy. Нужно понять, очистит ли он картинку, удалит ли PHP-переменную и нужен ли дополнительный clear.

Официальный краткий текст говорит об освобождении ресурсов. В проверенной текущей регистрации ImagickDraw destroy объявлен alias метода clear, без собственного тела C. Поэтому он очищает очередь/настройки этого Draw; это не оператор unset и не удаление пикселей другого объекта Imagick.

Синтаксис, вход и результат

ImagickDraw::destroy(): bool

У этого API нет аргументов. Вызов относится к конкретному Draw и его состоянию. bool: alias направляется на clear, который возвращает true. Manual prose говорит об отсутствии результата, но signature — bool. В прочитанных stub/регистрации destroy не помечен deprecated: статус метода clone нельзя переносить на destroy. Не объявляем хронологию всех выпусков по одному текущему исходнику; фактическую старую связку проверяют отдельно.

Доступность по официальному snapshot: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в нём пусты. Для clone статус текущей реализации оговорён отдельно по C-коду, для destroy отдельно проверен alias. Номер первой версии изменения без подтверждения не указан. Программы используют PHP 8.2+ и требуют imagick.

Ошибки в raw-страницах отдельно не расписаны. Создание/копирование может отказать из-за ресурсов, неправильная работа со стеком приводит к ImagickDrawException; растеризация/сохранение могут завершиться ImagickException либо false. Нативные примеры здесь ещё не выполнены: успешный lint не доказывает установленное расширение, возврат API или доступность каталога. Не подавляйте предупреждения перед HTTP-выводом картинки: сначала завершите подготовку и обработку ошибок.

Полный сохранённый контракт PHP Manual

Все поля snapshot оставлены неизменными, включая противоречивые return-тексты: описание, параметры, версии, changelog, see-also, сведения о примерах и hashes. Разъяснение актуального binding дано отдельно, не подменяет исходную запись.

{
  "id": "imagickdraw.destroy",
  "name": "ImagickDraw::destroy",
  "purpose_en": "Frees all associated resources",
  "description_en": "Frees all resources associated with the ImagickDraw object.",
  "signature": "ImagickDraw::destroy(): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.destroy.php",
  "official_page_sha256": "7d9c7521916a715da194b727b1b96ae165a5560fa6a6de07a983844baeb5b178",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/destroy.xml",
  "xml_sha256": "50445308ffe0eb05717e2dd3a6a6e09f273d6ad1c5230470f4fea9725aa8439c",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Разобраться с именем destroy: пояснение границы объекта, очереди и состояния
Разобраться с именем destroy: пояснение границы объекта, очереди и состояния Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.
Разобраться с именем destroy: минимальный результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->rectangle(30, 30, 210, 150);
$image->drawImage($draw);
$ok = $draw->destroy();
echo 'destroy=', $ok ? 'true' : 'false', '; type=', get_debug_type($ok), "\n";
unset($draw);
$path = __DIR__ . '/image-after-destroy.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'image-after-destroy.png', "\n";
$image->clear();

При успешном выполнении создаётся image-after-destroy.png 240×180. Сохранённая мятная карточка остаётся на $image после вызова destroy у Draw. В проверенной регистрации PHP binding destroy — alias clear, а не удаление $image и не оператор unset. После вызова программа отпускает имя $draw и больше с ним не работает. Перед именем файла консоль: destroy=true; type=bool. Последняя строка — image-after-destroy.png.

Практическая задача: Не принять alias clear за удаление имени объекта

В поддерживаемой текущим binding ветке destroy перенаправлен на clear. Если два PHP-имени обозначают один Draw, вызов через одно очищает общую очередь — второе имя не сохраняет её скрытую копию.

Не принять alias clear за удаление имени объектаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$alias = $draw;
$draw->rectangle(20, 30, 120, 130);
$alias->destroy(); // В проверенном binding это alias clear.
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#f1c6b7');
$draw->circle(210, 80, 245, 80);
$image->drawImage($draw);
echo 'same-object=', $alias === $draw ? 'yes' : 'no', "\n";
$draw->clear();
unset($alias, $draw);
$path = __DIR__ . '/shared-reset.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'shared-reset.png', "\n";
$image->clear();

Результат: shared-reset.png 280×180. Только персиковый круг: pending rectangle удалён из общего Draw вызовом через $alias. Имя $draw осталось, но команды и настройки были сброшены; перед новым кругом стиль задан явно. Это пример проверенной привязки destroy→clear, а не универсальное обещание семантики произвольной старой версии или метода с таким именем в другом классе. Перед именем файла консоль: same-object=yes. Последняя строка — shared-reset.png.

Ошибки, альтернативы и стоимость

Для ясного сброса используйте clear; вызовы clear и затем destroy в проверенной привязке повторяют одну операцию. unset($draw) убирает имя переменной, но другое имя того же объекта может остаться. Освобождение содержимого, уничтожение объекта после последнего владельца и снижение RSS процесса — разные события; не обещайте немедленного падения системного счётчика памяти.

Копия и сохранённые контексты требуют дополнительных ресурсов. Стоимость растёт с очередью команд и связанными настройками; не клонируйте большую подготовленную очередь ради одного цвета, если достаточно пустого шаблона или локального push/pop. В длительной задаче очищайте временный Draw после применения, не удерживайте ненужные копии в массивах и проверяйте полный процесс. Не обещайте, что clear/destroy немедленно снизят RSS: кеши, native allocator и жизненный цикл PHP-процесса тоже участвуют.

В практических программах foreach обходит компоненты, try/finally гарантирует попытку возврата состояния, catch обрабатывает демонстрационный отказ, unset отпускает имя переменной. Это разные операции. См. условия и циклы, исключения, копирование.

Связанные API: ImagickDraw::__construct · ImagickDraw::clone · ImagickDraw::clear · ImagickDraw::push · ImagickDraw::pop. Переходы: заливка, локальные оси и CTM.

ImagickDraw::pushВнутри компонента временно меняются заливка, толщина или координатное преобразование. После него нужен прежний стиль, а вручную сохранять все свойства неудобно.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::push(): bool

Внутри компонента временно меняются заливка, толщина или координатное преобразование. После него нужен прежний стиль, а вручную сохранять все свойства неудобно.

Push сохраняет текущий графический контекст на внутреннем стеке Draw. Он включает настройки и CTM; последующий pop вернёт сохранённое состояние. Это не возвращаемая PHP-копия и не отдельный новый объект в переменной. Для каждого успешного push нужен соответствующий pop, вложенные состояния возвращаются в обратном порядке.

Синтаксис, вход и результат

ImagickDraw::push(): bool

У этого API нет аргументов. Вызов относится к конкретному Draw и его состоянию. bool: true при успехе. При отказе PushDrawingWand текущий PHP wrapper превращает ошибку в ImagickDrawException, а не выдаёт новый Draw. Не присваивайте $draw=$draw->push(). Сохранённое состояние принадлежит стеку того же объекта.

Доступность по официальному snapshot: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в нём пусты. Для clone статус текущей реализации оговорён отдельно по C-коду, для destroy отдельно проверен alias. Номер первой версии изменения без подтверждения не указан. Программы используют PHP 8.2+ и требуют imagick.

Ошибки в raw-страницах отдельно не расписаны. Создание/копирование может отказать из-за ресурсов, неправильная работа со стеком приводит к ImagickDrawException; растеризация/сохранение могут завершиться ImagickException либо false. Нативные примеры здесь ещё не выполнены: успешный lint не доказывает установленное расширение, возврат API или доступность каталога. Не подавляйте предупреждения перед HTTP-выводом картинки: сначала завершите подготовку и обработку ошибок.

Полный сохранённый контракт PHP Manual

Все поля snapshot оставлены неизменными, включая противоречивые return-тексты: описание, параметры, версии, changelog, see-also, сведения о примерах и hashes. Разъяснение актуального binding дано отдельно, не подменяет исходную запись.

{
  "id": "imagickdraw.push",
  "name": "ImagickDraw::push",
  "purpose_en": "Clones the current ImagickDraw and pushes it to the stack",
  "description_en": "Clones the current ImagickDraw to create a new ImagickDraw, which is then added to the ImagickDraw stack. The original drawing ImagickDraw(s) may be returned to by invoking ImagickDraw::pop . The ImagickDraws are stored on a ImagickDraw stack. For every Pop there must have already been an equivalent Push.",
  "signature": "ImagickDraw::push(): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [],
  "return_en": "[return.success]",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::push example",
      "language": "php",
      "code_sha256": "cd98626d56e72188449add7bdeaddf5954263deeb09d586a013677f4abcff2ea"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.push.php",
  "official_page_sha256": "1c6e62cb55d12e8e5f8def92a28b23c32616c23a5ae3a27f1c578a3ae5cc3a99",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/push.xml",
  "xml_sha256": "2f0362119567312e8cb59bcad4345316422a8e60974a43f043ad05fadd46898b",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Сохранить локальное состояние: пояснение границы объекта, очереди и состояния
Сохранить локальное состояние: пояснение границы объекта, очереди и состояния Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.
Сохранить локальное состояние: минимальный результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->rectangle(20, 40, 100, 140);
$draw->push();
$draw->setFillColor('#c25732');
$draw->rectangle(120, 40, 200, 140);
$draw->pop();
$draw->rectangle(220, 40, 300, 140);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/temporary-style.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'temporary-style.png', "\n";
$image->clear();

При успешном выполнении создаётся temporary-style.png 320×180. Три карточки: мятная, оранжевая, снова мятная. Push сохранил состояние перед временным цветом; pop вернул его. Все три rectangle остаются в общей очереди и применяются одним drawImage. Последняя строка — temporary-style.png.

Практическая задача: Вложить локальную тему в тему компонента

Внутри персиковой панели нужен сиреневый статус. После его локальной темы вернём персиковую, а затем основную мятную, не перечитывая и не копируя все свойства вручную.

Вложить локальную тему в тему компонентаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(360, 240, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->push();
$draw->setFillColor('#f1c6b7');
$draw->rectangle(20, 20, 340, 160);
$draw->push();
$draw->setFillColor('#c5cee8');
$draw->circle(180, 90, 210, 90);
$draw->pop();
$draw->rectangle(30, 180, 150, 215);
$draw->pop();
$draw->rectangle(210, 180, 330, 215);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/nested-themes.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'nested-themes.png', "\n";
$image->clear();

Результат: nested-themes.png 360×240. Сверху персиковая панель с сиреневым кругом. Снизу левый образец персиковый после первого pop, правый мятный после второго. Порядок — LIFO: последняя сохранённая тема возвращается первой. Два push сбалансированы двумя pop; обе ранее записанные фигуры сохранились. Последняя строка — nested-themes.png.

Ошибки, альтернативы и стоимость

Push/pop — область локальных настроек, а не транзакция команд. Pop не удаляет фигуры, записанные внутри области, и не снимает их с $image. Следите за балансом: лишний push удерживает состояние, лишний pop даёт ошибку. Не начинайте парный finally до успешного push.

Копия и сохранённые контексты требуют дополнительных ресурсов. Стоимость растёт с очередью команд и связанными настройками; не клонируйте большую подготовленную очередь ради одного цвета, если достаточно пустого шаблона или локального push/pop. В длительной задаче очищайте временный Draw после применения, не удерживайте ненужные копии в массивах и проверяйте полный процесс. Не обещайте, что clear/destroy немедленно снизят RSS: кеши, native allocator и жизненный цикл PHP-процесса тоже участвуют.

В практических программах foreach обходит компоненты, try/finally гарантирует попытку возврата состояния, catch обрабатывает демонстрационный отказ, unset отпускает имя переменной. Это разные операции. См. условия и циклы, исключения, копирование.

Связанные API: ImagickDraw::__construct · ImagickDraw::clone · ImagickDraw::clear · ImagickDraw::destroy · ImagickDraw::pop. Переходы: заливка, локальные оси и CTM.

ImagickDraw::popВременная тема или перевод локальных координат завершились; следующий компонент должен продолжить прежний стиль, даже если внутри произошёл отказ.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pop(): bool

Временная тема или перевод локальных координат завершились; следующий компонент должен продолжить прежний стиль, даже если внутри произошёл отказ.

Pop возвращает последний контекст, сохранённый push, по принципу LIFO. Внутренний текущий контекст удаляется со стека, но это не уничтожение PHP-объекта $draw. Команды, записанные до pop, сохраняются и после возврата настроек будут растеризованы.

Синтаксис, вход и результат

ImagickDraw::pop(): bool

У этого API нет аргументов. Вызов относится к конкретному Draw и его состоянию. bool: true при успехе. Текущий wrapper при неудаче PopDrawingWand выбрасывает ImagickDrawException. Он не возвращает прежний ImagickDraw или PNG. Лишний pop без предшествующего push — ошибка, а не безопасный способ сбросить все настройки.

Доступность по официальному snapshot: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в нём пусты. Для clone статус текущей реализации оговорён отдельно по C-коду, для destroy отдельно проверен alias. Номер первой версии изменения без подтверждения не указан. Программы используют PHP 8.2+ и требуют imagick.

Ошибки в raw-страницах отдельно не расписаны. Создание/копирование может отказать из-за ресурсов, неправильная работа со стеком приводит к ImagickDrawException; растеризация/сохранение могут завершиться ImagickException либо false. Нативные примеры здесь ещё не выполнены: успешный lint не доказывает установленное расширение, возврат API или доступность каталога. Не подавляйте предупреждения перед HTTP-выводом картинки: сначала завершите подготовку и обработку ошибок.

Полный сохранённый контракт PHP Manual

Все поля snapshot оставлены неизменными, включая противоречивые return-тексты: описание, параметры, версии, changelog, see-also, сведения о примерах и hashes. Разъяснение актуального binding дано отдельно, не подменяет исходную запись.

{
  "id": "imagickdraw.pop",
  "name": "ImagickDraw::pop",
  "purpose_en": "Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw",
  "description_en": "Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw. Multiple ImagickDraws may exist. It is an error to attempt to pop more ImagickDraws than have been pushed, and it is proper form to pop all ImagickDraws which have been pushed.",
  "signature": "ImagickDraw::pop(): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [],
  "return_en": "[return.success]",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pop.php",
  "official_page_sha256": "221fa8acff970586eb104423c6cac6e1b7cb4bbd8dcbcbfdda3f25add6b59627",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pop.xml",
  "xml_sha256": "ba998aaca883b9838b924c66227f3bbdf9a44071e5db8e4f1ace00535713f52d",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Вернуть последнее сохранённое состояние: пояснение границы объекта, очереди и состояния
Вернуть последнее сохранённое состояние: пояснение границы объекта, очереди и состояния Изображение/схема построены отдельно; они не исполняют PHP и не доказывают его lifecycle/return. Чистые рисунки — эквиваленты ImageMagick CLI, стрелки владения и очередей — поясняющая модель.
Вернуть последнее сохранённое состояние: минимальный результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->rectangle(20, 40, 100, 140);
$draw->push();
$draw->setFillColor('#c25732');
$draw->rectangle(120, 40, 200, 140);
$draw->pop();
$draw->rectangle(220, 40, 300, 140);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/restored-style.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'restored-style.png', "\n";
$image->clear();

При успешном выполнении создаётся restored-style.png 320×180. Три карточки: мятная, оранжевая, мятная. Pop восстановил настройки последующих фигур, не отменив оранжевую карточку. Он вернул bool успеха, а не новый объект и не предыдущий растровый кадр. Последняя строка — restored-style.png.

Практическая задача: Вернуть состояние даже после отказа компонента

Во время записи временной карточки обнаружены неполные данные. Finally вернёт настройки, чтобы следующий компонент не унаследовал оранжевую тему. При этом уже записанная оранжевая фигура сама не отменится.

Вернуть состояние даже после отказа компонентаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->rectangle(20, 40, 100, 140);
try {
    $draw->push();
    try {
        $draw->setFillColor('#c25732');
        $draw->rectangle(120, 40, 200, 140);
        throw new RuntimeException('demo: incomplete data');
    } finally {
        $draw->pop();
    }
} catch (RuntimeException $error) {
    echo 'handled=', $error->getMessage(), "\n";
}
$draw->rectangle(220, 40, 300, 140);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/restored-after-failure.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'restored-after-failure.png', "\n";
$image->clear();

Результат: restored-after-failure.png 320×180. Три карточки всё ещё мятная/оранжевая/мятная: finally восстановил тему последней, но pop не откатил уже записанную среднюю. Для атомарного компонента готовьте его в отдельном Draw/копии и применяйте только после успеха; clear удалил бы всю очередь, включая удачную первую фигуру. Перед именем файла консоль: handled=demo: incomplete data. Последняя строка — restored-after-failure.png.

Ошибки, альтернативы и стоимость

Возвращайте состояние в finally, если внутри компонента возможны исключения, но не скрывайте лишние pop подавлением ошибок. Pop восстанавливает стиль/CTM, а не отменяет уже записанную геометрию. Для атомарного рисунка отделите команды компонента и применяйте их только после успешной подготовки.

Копия и сохранённые контексты требуют дополнительных ресурсов. Стоимость растёт с очередью команд и связанными настройками; не клонируйте большую подготовленную очередь ради одного цвета, если достаточно пустого шаблона или локального push/pop. В длительной задаче очищайте временный Draw после применения, не удерживайте ненужные копии в массивах и проверяйте полный процесс. Не обещайте, что clear/destroy немедленно снизят RSS: кеши, native allocator и жизненный цикл PHP-процесса тоже участвуют.

В практических программах foreach обходит компоненты, try/finally гарантирует попытку возврата состояния, catch обрабатывает демонстрационный отказ, unset отпускает имя переменной. Это разные операции. См. условия и циклы, исключения, копирование.

Связанные API: ImagickDraw::__construct · ImagickDraw::clone · ImagickDraw::clear · ImagickDraw::destroy · ImagickDraw::push. Переходы: заливка, локальные оси и CTM.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.