Как стать автором
Обновить

Расширяем класс Imagick

Время на прочтение2 мин
Количество просмотров4.6K
Приветствую всех своих первых читателей!

Завязка


Написать эту самую первую статью меня толкнул всего один единственный баг в библиотеки Imagick, который отнял у меня некоторое время.

Началось всё с того, что была задача написать некий класс на php для работы с изображениями. Решил прибегнуть к помощи ImageMagick и к расширению Imagick.
Сам класс Imagick имеет обширное количество методов, однако требовалось расширить его и добавить собственные методы, такие, как проверка существования кеша изображения и получения пути к нему, собственно само кеширование ну и некоторые другие вспомогательные.

Для этих целей был написан нехитрый класс:
<?php
namespace app;
class Images extends \Imagick {
    private $_filePath = null;
    private $_cacheFile = null;

    // переопределенный метод
    public function readImage($filePath) {
        $this->_filePath = $filePath;
        parent::readImage($this->_filePath);
    }
    
    // что-то от себя
    public function myMethod() {

    }

    // дальше идёт продолжение кода...
?>


Теперь давайте разберёмся, почему этот класс работать НЕ будет.

Кульминация


Причиной неработоспособности данного кода состоит в том, что член этого класса "_filePath", как и любой другой, будет иметь значение NULL. В этом и заключается баг №59565

Проблема оказалось решающей, ведь без использования собственных переменных мой класс терял всякий смысл.

Развязка


Требуется решить данную проблему таким способом, чтобы сохранить весь функционал, гибкость и, при выходе стабильного релиза Imagick можно было бы с минимальным вмешательством в коде перейти на «правильный путь»

Для этого мне пришла в голову использовать магический метод __call, который вызывается тогда, когда вызываемый метод нашего класса не найден. В итоге класс получился следующим:

<?php
namespace app;
class Images {
    private $_filePath = null;
    private $_cacheFile = null;
    private $_Imagick = null;

    public function __construct() {
        $this->_Imagick = new \Imagick();
    }

    // переопределенный метод
    public function readImage($filePath) {
        $this->_filePath = $filePath;
        $this->_Imagick->readImage($this->_filePath);
    }
    
    // что-то от себя
    public function myMethod() {

    }
    
    // то, что решит проблему
    public function __call($name, $args) {
        return call_user_func_array(array($this->_Imagick, $name), $args);
    }
    // дальше идёт продолжение кода...
?>

Выводы


Согласен с тем, что метод решения какой-то костыльный, однако в этой ситуации подходит больше всего.
После стабильного релиза, в классе будет достаточно добавть " extends \Imagick" и убрать методы "__call"
и конструктор.
PECL Imagick — на сегодня, версия 3.0.1 является последней стабильной. В версии «3.1.0b1» баг уже пофиксен. Кроме этого, есть уже и «3.1.0RC1». Однако когда выйдет стабильная версия — пока не известно.

Буду рад услышать тех, кто уже встречался с этой проблемой и их варианты решения.
Теги:
Хабы:
Всего голосов 7: ↑5 и ↓2+3
Комментарии14

Публикации

Истории

Работа

PHP программист
112 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
11 сентября
Митап по BigData от Честного ЗНАКа
Санкт-ПетербургОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн