Введение в DevelNext

Начиная работу со студией DevelNext, могут возникнуть трудности, с чего начать, чтоб реализовать хотя бы простейший функционал. Я не буду касаться основ PHP, у пользователя должны быть хотя бы базовые знания ООП, т.к. программирование в DN полностью основано на объектах.

К сожалению, с документацией всё очень печально, она разбросана на нескольких ресурсах, и многие аспекты не описаны. Собрал нужные ссылки:

  • hub.develnext.org — Официальная документация DevelNext
  • jphp-docs.readthedocs.io — Описание функций JPHP
  • j-php.net— Здесь есть примеры использования и описаны аналоги PHP функций
  • docs.oracle.com — CSS стили для JavaFX
  • GitHub — Исходники DevelNext
  • GitHub — Исходники JPHP

Навигация по статье

В DN поддерживается синтаксис PHP 5.6, плюс некоторые фичи из PHP 7 (ожидается полная поддержка PHP 7). Интерпретатор JPHP написан на языке Java, есть возможность скомпилировать исходники в байт код Java Virtual Machine (защита от декомпиляции). Графическая платформа — JavaFX.

Компиляция в байт-код

Компиляция в байт-код

С одной стороны, Java позволит писать кроссплатформенные, высокопроизводительные приложения, плюс есть возможность подключить готовые пакеты Java с богатой функциональностью (нужно собрать их в пакет расширений), но с другой — зависимость от Java (если не установлена JVM на ПК клиента, необходимо тащить её с собой, а это более 100 мб), «прожорливость» готовых программ (простейшее hello world может потребовать десятки-сотни мб ОЗУ), относительно длительный запуск программы (нужно время для старта JVM).

Особенности JPHP

К сожалению, интерпретатор не лишён багов и не редко возникает ошибка JVM — NullPointerException, что может быть из-за ошибки как в JPHP, так и в исходном коде PHP.

Синтаксические особенности. В отличии от оригинального php, такой синтаксис является валидным:

Описание событий в комментариях. На мой взгляд, довольно красивое решение. События объектов привязываются к функциям комментарием @event.

Событие действие (action) для кнопки с id button будет выглядеть таким образом:

События можно комбинировать, правда парсер не сработает и не отобразит события в левой колонке, вот например события действие + клик левой кнопкой мыши:

Несмотря на то, что в левом столбце отображается одно событие, сработают оба, т.к. прописаны необходимые комментарии

Событие действие включает в себя нажатие мышью, а при фокусе на кнопке —
нажатие пробела.

Пространства имён. Про пространства имён я писал ранее, всё как в оригинальном php, особенность лишь в операторе use. Есть разные режимы его работы:

Выбор режима use

В первом случае use работает как в оригинальном php — импортирует имя класса:

Во втором же, для экономии кода можно импортировать целый пакет, без описания каждого класса по отдельности:

Редактор в DN автоматически подставляет необходимые use, что довольно удобно. При копировании-вставке кода редактор предложит прописать нужные use:

Функции. JPHP поддерживает большое количество стандартных PHP функций таких как file_get_contents, strlen, array_merge и т.д. Проверить, поддерживается ли функция, можно с помощью function_exists:

Для поддержки curl_* функций есть пакет jURL, для preg_ — Preg. Если в подсказках появляется имя необходимой функции, то она точно поддерживается средой.

Подсказка

Подсказка


Если же нужной функции нет, есть аналоги практически всех родных PHP функций, их можно найти в документации (ссылки в начале поста).

Отладка кода. Каких-либо специальных функций для отладки нет, только класс Logger. Весь stdout поток отображается в консоли. Есть функции pre, alert, которые отображают информацию в всплывающем окне, но это не так практично, как var_dump, т.к. если объем информации большой, он обрежется под размеры окна.

Примеры сообщений из Logger

Редактор

Редактор с каждой версией среды всё лучше и лучше, но всё равно с багами… Если проект большой, готовьтесь к тормозам. Но тем не менее, редактор с системой подсказок и автодополнением значительно помогает при написании кода. Если код содержит комментарии формата phpdoc, редактор распарсит их и будет отображать соответствующие подсказки.


Описание функций


Допустим, что в списке listView содержатся текстовые объекты UXLabel, и чтоб редактор отображал корректные подсказки, добавим соответствующий комментарий.

Итак, с чего начать

Создав новый проект. перед нами предстаёт пустая форма MainForm и пара пустых модулей — MainModule, AppModule.

Формы и графические объекты

Каждой статически созданной форме в DevelNext соответствует отдельный класс. Новый проект содержит пустую форму и соответствующий ей одноименный класс — MainForm.

Здесь, как и в классическом php, есть поддержка «магических» методов. Метод __construct будет вызван при старте приложения, но в данный момент форма ещё не существует и обращение к графическим элементам невозможно, для этого лучше использовать событие Появление (show). Последовательность, в которой вызываются события: __construct -> создание формы -> Перед появлением (showing) -> появление формы, отрисовка графики -> Появление (show)

Все графические объекты изначально обладают стандартным набором свойств и методов. Свойства самой формы можно просмотреть введя в редакторе $this->

В подсказках — все свойства и методы текущей формы

Кнопки, формы и прочие графические объекты являются свойствами текущего класса, обратиться к этим объектам и их свойствам можно так: $this->id_объекта->свойство
Чтоб просмотреть, как именуется то или иное свойство, можно выделить объект и навести мышь на нужное поле или ввести в редакторе $this->id_объекта-> для отображения подсказок.

Свойство текст именуется как ->text


Подсказки для объекта edit

Обращение к графическои объектам возможно только из главного (графического) потока.
Если вы используете функции для работы с потоками (Thread), чтоб вернуться к графическому потоку, есть функции uiLater и uiLaterAndWait

Подробнее про потоки я писал в отдельной статье.

Есть небольшой баг с размерами формы, если форма открывается и закрывается несколько раз,
её размеры почему-то меняются, чтоб вернуть исходные размеры, создайте событие «закрытие формы» и поместите туда код $this->free();

Есть событие формы — перед появлением (showing). Если из этого события открывать другую форму, закрывать текущую или менять размеры текущей формы, это может либо вызвать ошибку, либо визуально никаких изменений не произойдёт. Чтоб это исправить — нужна задержка в пару мс:

Выбрать главную форму можно в настройках проекта. Если главной формы нет, будет выполнен только тот код, который расположен в модуле «Загрузчик» (об этом ниже).

Выбор главной формы — она будет отображена при запуске проекта

Система модулей

В каждом проекте по умолчанию присутствует модуль Загрузчик (AppModule), даже если его удалить, он будет заново создан при открытии проекта :-) . Судя по названию, этот модуль запускается сразу после старта проекта. Если в настройках не выбрана главная форма, будет выполнен только код из загрузчика. У модуля Загрузчик есть два события — Подключение и Загрузка модуля, практической разницы между этими событиями я не заметил. Если нужно создать приложение без графики (как например это), код необходимо поместить в одно из этих событий.

Другие же модули могут быть созданы самим пользователем. Модули удобны тем, что в них можно вынести отдельную функциональность, например, модуль для базы данных, модуль с выбором папок/файлов и т.д. Получится, что в классе формы будет расположен код, отвечающий за графику этой формы, а каждая функциональность в своём модуле, т.е. не будет мешанины, всё станет на свои полки.

На модулях можно располагать элементы (таймер, база данных и пр.) как графические элементы на форме.

Обратиться к объектам модуля можно так же через $this->…

Обращение к объектам модуля

Любой модуль (кроме загрузчика) можно подключить к любой форме

Подключение модуля к форме


После подключения объекты модуля (таймер, база данных, …) станут доступны для вызова из формы, а в модуле можно будет обратиться к элементам формы (текстовое поле, кнопка, …). Т.е. из формы можно будет управлять таймером через $this->timer->…, а выбранный путь к папке в модуле можно будет вывести в поле формы:

1. Создаём форму, на неё помещаем поле для ввода и кнопку. Подключаем модуль к форме.


2. На модуль помещаем диалог для файлов. В настройках диалога выбираем объекты формы — кнопку и поле для ввода.


3. Получается, что мы связали диалог выбора и графические объекты, не написав при этом ни строки кода

При подключении модуля, форме становятся доступны методы модуля. Если поместить в модуль такой код:

То из формы можно будет вызвать метод methodFromMainModule() так:

Метод доступен через $this. Поведение похоже как если бы форма была унаследована от модуля (MainForm extends MainModule)

У каждого модуля есть свойство Одиночка. При каждом создании формы (или при создании нескольких форм — когда один модуль подключён ко многим формам) будет создан отдельный экземпляр модуля. Если модуль является одиночкой, то для всех форм будет создан лишь один единственный экземпляр этого модуля. Это полезно, например, при работе с базой данных, чтоб не делать несколько подключений к базе, модуль одиночка один раз создаст подключение и будет держать его до завершения программы. Иначе — каждая новая форма с подключенным модулем будет создавать новое подключение.

Свойство модуля — одиночка

CSS-Стили

Для оформления используются css стили. Они похожи на css из web, но это не одно и то же. У каждого графического объекта есть свой уникальный id и каждый объект может иметь несколько классов. Стили можно прописать либо в графе CSS-стили, которая есть у каждого объекта, либо во вкладке Внешний вид.

ID объекта, стили, классы


Стили всего проекта

Описание стилей есть в официальной документации.

Пакеты расширений

Чтоб добавить новый функционал (новые php или java классы) в DevelNext можно подключить пакет расширений:

Пакеты расширений в DevelNext

Пакеты расширений в DevelNext


Сразу после установки доступно большое количество встроенных пакетов. Свои пакеты расширений я выкладываю здесь и в репозитории github. О том, как создать свой простой пакет расширений я писал в статье.

p.s. Статья актуальна для DevelNext версии 16.6.0
p.p.s. Ещё довольно много нюансов, которые следует описать, всё в одной статье охватить нереально.

Добавить комментарий

Ваш e-mail не будет опубликован.