За два года проект 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.