|
| 1 | +# Система пакетов |
| 2 | + |
| 3 | +> ⚠️ Внимание, в данной статье описывается механизм, который находится в разработке и появится лишь в DevelNext 16.5 версии. |
| 4 | +
|
| 5 | +Система пакетов в jphp позволяет объединить несколько классов, функций и констант в один пакет. Затем, пакет можно легко подключить в скрипте через `use <название пакета>`, благодаря чему в скрипте станут доступны все классы, функции и константы пакета. |
| 6 | + |
| 7 | +> ℹ️ Не стоит путать пакет jphp с пакетами расширений DevelNext. Пакет в jphp можно создать вне всякого расширения DevelNext. Это является новой возможностью языка php в рамках jphp. |
| 8 | +
|
| 9 | +--- |
| 10 | + |
| 11 | +#### Оглавление |
| 12 | +- [Что такое пакет?](#what) |
| 13 | +- [Структура пакета](#structure) |
| 14 | +- [Автозагрузка пакетов](#autoloading) |
| 15 | +- [Поддержка пакетов в DevelNext](#develnext) |
| 16 | +- [Пример использования](#example) |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +<a name=what/> |
| 21 | +### Что такое пакет? |
| 22 | + |
| 23 | +Пакет - это способ легко объединять несколько классов, функций и констант под одним коротким именем. Пакет легко подключается в php файлах через конструкцию `use <имя пакета>`, это похоже на то, как вы подключаете классы в php. |
| 24 | + |
| 25 | +> Пакеты выходят за рамки классического языка php и поддерживаются только в jphp и develnext. |
| 26 | +
|
| 27 | +--- |
| 28 | + |
| 29 | +<a name=structure/> |
| 30 | +### Структура пакета |
| 31 | +Пакет в jphp состоит из списка классов, функций и констант. Он имеет короткое название, которое всегда начинается с маленькой буквой. В итоге в пакете мы имеем: |
| 32 | +- Имена классов |
| 33 | +- Имена функций |
| 34 | +- Имена констант |
| 35 | + |
| 36 | +> Имена должны быть полными, namespace классов, функций и констант может быть любой, нет никаких строгих правил на этот счет. |
| 37 | +
|
| 38 | +--- |
| 39 | + |
| 40 | +<a name=autoloading /> |
| 41 | +### Автозагрузка пакетов |
| 42 | + |
| 43 | +JPHP из коробки предоставляет механизм автозагрузки пакетов по аналогии с автозагрузкой классов. Реализуется он через класс `php\lang\PackageLoader` и в движке для develnext реализован свой загрузчик пакетов [`FrameworkPackageLoader`](https://github.com/jphp-compiler/develnext/blob/master/jphp-app-framework/src/php/framework/FrameworkPackageLoader.php), который реализует следующий механизм подключения пакетов: |
| 44 | + |
| 45 | +1. Все пакеты находятся в папке ресурсов `.packages`, в текстовом файле `.packages/<имя пакета>.pkg`. |
| 46 | +2. Опционально подключается файл `.packages/<имя пакета>.php` при подключении пакета (файл не обязателен). |
| 47 | +3. Файл пакета `.pkg` содержит список классов, функций и констант в следующем формате: |
| 48 | +```ini |
| 49 | +[classes] |
| 50 | +Class1 |
| 51 | +namespace1\Class2 |
| 52 | +... |
| 53 | + |
| 54 | +[functions] |
| 55 | +func1 |
| 56 | +func2 |
| 57 | +namespace1\func3 |
| 58 | + |
| 59 | +[constants] |
| 60 | +constant1 |
| 61 | +namespace2\constant2 |
| 62 | +``` |
| 63 | + |
| 64 | +> Для пакетов расширений этот механизм работает также! |
| 65 | +
|
| 66 | +--- |
| 67 | + |
| 68 | +<a name=develnext /> |
| 69 | +### Поддержка пакетов в DevelNext |
| 70 | + |
| 71 | +DevelNext начиная с версии 16.5 поддерживает систему пакетов, описанную выше. Более того, многие классы из DevelNext входят в определенные пакеты, например: |
| 72 | + |
| 73 | +- `gui` - пакет для JavaFX GUI компонентов. |
| 74 | +- `std` - общий пакет для всех стандартных классов из jphp. |
| 75 | + |
| 76 | +Более того, develnext по-умолчанию помещает все классы проекта в определенный пакет, имя которого выбирается при создании проекта, по-умолчанию это `app`. |
| 77 | + |
| 78 | +-- |
| 79 | + |
| 80 | +Если вы пишите расширение для DevelNext, то для того, чтобы среда понимала, в каком пакете находится ваш класс, необходимо добавить следующий комментарий над классом: |
| 81 | + |
| 82 | +```php |
| 83 | +/** |
| 84 | + * @packages <название_пакета> |
| 85 | + **/ |
| 86 | +class MyClass { |
| 87 | + |
| 88 | +} |
| 89 | +``` |
| 90 | + |
| 91 | +> ⚠️ Также не забудьте сформировать файл `.packages/<название пакета>.pkg` в папке расширения `vendor`, чтобы проект корректно компилировался с вашим пакетом. |
| 92 | +
|
| 93 | +--- |
| 94 | + |
| 95 | +<a name=example /> |
| 96 | +### Пример использования |
| 97 | + |
| 98 | +```php |
| 99 | +use std, gui, framework, app; // подключаем 4 пакета. |
| 100 | + |
| 101 | +$button = new UXButton(); // UXButton из пакета gui, не нужно писать use php\gui\UXButton, достаточно use gui. |
| 102 | +``` |
0 commit comments