За два года проект PHPQt5 перерос из модуля для DevelStudio (да-да, начиналось всё со всеми любимой и одновременно ненавидимой DS!) в самостоятельную библиотеку для разработки полноценных графических интерфейсов для десктопных ОС (в основном - для Windows, эта ОС поддерживается на официальном уровне; запуск на Linux и MacOS лишь периодически тестируются).

На этой странице вы сможете вкратце ознакомится с историей проекта.

 

Первая реализация. php_qml.

Изначально проект представлял из себя модуль для DS с возможностью запуска QML-скриптов, назывался он php_qml и первое упоминание о нём было 20 июня 2015 года. Таковым проект просуществовал не более двух-трёх дней :)

 

Вторая реализация. php_qt.

Поддержка QML в PHP в том виде, в котором она была представлена, не имела перспектив и вектор развития проекта был направлен на поддержку QtWidgets вместо QtQuick (QML).

Первые наброски библиотеки с возможностью инициализации виджетов были продемонстрированы 22 июня 2015г., одновременно с этим было принято решение сделать её немного самостоятельной, дав возможность запускаться без DevelStudio. Но сама библиотека была по прежнему собрана как модуль для PHP 5.3, используемый в DS, что сохраняло совместимость этих двух продуктов.

Днём рождения проекта можно считать именно 22 июня 2015г. 

 

Чтобы подчеркнуть переход на более обширную поддержку Qt, библиотека была переименована в php_qt5. В самом начале своего развития она требовала наличия "обёрток" над классами C++, написанными на PHP, выглядело это примерно так:

class QObject {
    public $self;
    
    public function __construct($parent = null, $class_name = __CLASS__) {
        $this->self = pq_create_qobject($class_name);
        if($parent !== null) {
            $this->parent = $parent;
        }
    }
    
    public function __set($property, $value) {
        if(!isset($this->$property)) {
            switch ($property) {
                case "parent":
                    return pq_set_value($this->self, $property, $value->self);
                    break;
                
                default: return pq_set_value($this->self, $property, $value);
            }
        }
        $this->$property = $value;
        return true;
    }
    
    public function __get($property) {
        if(isset($this->$property)) {
            return $this->$property;
        }
        return pq_get_value($this->self, $property);
    }
}

class QWidget extends QObject {
    public function __construct($parent = null, $class_name = __CLASS__) {
        parent::__construct($parent, $class_name);
    }
}

class QToolButton extends QObject {
    public function __construct($parent = null, $class_name = __CLASS__) {
        parent::__construct($parent, $class_name);
    }
} 

Такая модель отчасти была заимствована из DevelStudio. Прежде чем создать какой-то объект, необходимо было описать иерархию наследования от QObject, а в классе QObject через магию PHP вызывались необходимые процедуры библиотеки для инициализацией и управление объектами. К счастью, такая модель просуществовала немногим дольше, чем php_qml - примерно 5-6 дней, затем все обёртки были убраны из PHP, а сами классы были зарегистрированы в подключаемой библиотеке.

Кстати, замечу, что на тот момент поддерживалось создание только тех классов, которые были унаследованы от QObject, т.е. не было никаких QPoint, QString, QImage и прочих-прочих. Да и вообще список поддерживаемых классов был жестко фиксирован в самой библиотеке, т.к. в ней тоже нужно было создать некое описание этих классов.

С 1 июля 2015г. структура библиотеки php_qt5 уже сформировалась и она начала обрастать полезным функционалом, добавлялись классы, появилась поддержка системы сигналов и слотов; а вот поддержка DS на тот момент уже была упразднена.

 

Третья реализация. PHPQt5.

18 июля 2015г. вышла в свет первая версия движка PQEngine, он был предназначен для "прямого" запуска php-скриптов без использования терминала и исполняемого php.exe (только для Windows, да... еще и с привязкой к WinApi). 

Немного позднее (28 июля 2015г.) библиотека php_qt5 вошла в состав движка, но уже под новым именем: PHPQt5. Данная реализация проекта была наиболее насыщена идеями и их воплощениями (порядок примерно сохранён):

  • у проекта появился сайт (вы сейчас на нём );
  • появилась первая реализация сборщика проектов PQBuilder, пока что он умел лишь создавать исполняемый файл Windows с установленной иконкой приложения, который подключал библиотеку PQEngine.dll и вызывал функцию исполнения php-скрипта;
  • зародился PQCreator, который мог стать DevelStudio-подобной IDE, но не стал по ряду причин, среди которых была острая нехватка времени на разработку и движка и IDE :(
  • появилась поддержка локализации приложений;
  • у проекта появился логотип (это тоже крайне важно :D) - отпечаток кошачей лапы на голубом фоне (да, я люблю котиков, у меня их, на минуточку, двое!);
  • из движка и библиотеки PHPQt5 были выпилены участки привязанные к WinAPI, движок стал кроссплатформенным.

 

Четвертая реализация. HOROLOGIUM.

Ноябрь 2015г. - пятимесячный движок разросся настолько, что дальнейшее развитие предполагало превращение его в неповоротливого монолитного монстра. Все поддерживаемые классы регистрировались прямо в библиотеке PHPQt5, а их описание (обёртки) становились всё жирнее и жирнее. Движок в срочном порядке требовал разделения мух от котлет!

И так, 14 ноября 2015г. была выпущена первая реализация модульной структуры движка. Все классы были убраны из библиотеки PHPQt5 и вынесены как отдельные подключаемые модули, управление которыми было возложено на движок PQEngine. Благодаря этому движок похудел примерно на ~8-10 Мб! Это была версия 0.4, которая получила кодовое имя HOROLOGIUM.

Именно с этой версии было принято решение как-то выделять особо значимые реализации. Для этого были взяты названия созвездий. Horologium - созвездие часы.

Модульность движка была самым важным событием в данном периоде, но помимо него было еще несколько интересных:

  • портирование на PHP 7;
  • публикация на GitHub'e;
  • статическая линковка движка с приложением, т.е. файл PQEngine.dll уже не требуется;
  • а вот с библиотеками Qt всё наоборот - ранее они линковались статически, а теперь динамически. Данный шаг был сделан для обеспечения совместимости создаваемых проектов с оригинальным дистрибутивом Qt;
  • смена компилятора с MinGW на MSVC;
  • реализация поддержки протокола qrc:// для обращения к ресурсам приложения;

 

Пятая реализация. Всё те же Часы полгода спустя.

Проект обзавёлся собственной метаобъектной системой PlastiQ, что позволило преодолеть барьер с регистрацией не QObject-классов. Хотя некоторые "не QObject-классы" уже поддерживались в предыдущей версии, их реализация была несколько затруднительна и затратна. Ранее список поддерживаемых классов состоял примерно из 3-40 пунктов (очень скромно), но как только появился PlastiQ, поддерживаемых классов стало более трёхста! А на сегодняшний день в этот список входит примерно ~700 классов Qt.

Приход PlastiQ не только увеличил количество поддерживаемых классов, но и расширил функционал работы с ним. На сегодняшний день поддерживаются практически все методы, сигналы и слоты Qt-объектов, так же полностью поддерживается система событий в том же виде, в каком она представлена в Qt.

Вот такой огроменный шаг вперёд. Данная версия была выпущена 3 августа 2016 года.

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

 

Шестая реализация. ANDROMEDA.

Идея интеграции с какой-нибудь IDE давно витала вокруг проекта. Предпринимались попытки привязки к Eclipse, но идея не получила поддержки и не развивалась. В итоге, на распутье между выбором поддержки дизайнера форм и поддержки умного редактора PHP-кода, выбор пал на первое. И здесь альтернатив QtCreator'у просто-напросто не было, поэтому был разработан плагин для среды QtCreator, с помощью которого на сегодняшний день создаются проекты.

Плагин регистрирует в QtCreator'e новые типы файлов - *.php и *.phpqt5 (файл проекта), определяет правила работы с проектом и подготавливает окружение для сборки проектов. 

Сборщик проектов, ранее именуемый как PQBuilder, был понижен в должности переработан под новое окружение и переименован в PHPQt5Make. Теперь бывший сборщик занимается не сборкой приложения, а подготовкой проекта к компиляции и генерацией исходных кодов, а сам процесс сборки полностью возложен на IDE.

 
comments powered by HyperComments