Pull to refresh

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

Reading time2 min
Views4.5K
Приветствую всех своих первых читателей!

Завязка


Написать эту самую первую статью меня толкнул всего один единственный баг в библиотеки 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». Однако когда выйдет стабильная версия — пока не известно.

Буду рад услышать тех, кто уже встречался с этой проблемой и их варианты решения.
Tags:
Hubs:
+3
Comments14

Articles