PHPackages                             zer0-framework/core - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. zer0-framework/core

ActiveFramework[Framework](/categories/framework)

zer0-framework/core
===================

v0.1.9(4y ago)42.2k16GPL-3.0-or-laterPHPPHP &gt;=7.2

Since May 4Pushed 4y ago1 watchersCompare

[ Source](https://github.com/zer0-framework/core)[ Packagist](https://packagist.org/packages/zer0-framework/core)[ Docs](https://github.com/zer0-framework/core)[ RSS](/packages/zer0-framework-core/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (1)Versions (11)Used By (6)

Философия
=========

[](#философия)

*Данный раздел можно пропустить, но он рекомендуется разработчикам к прочтению.*

Фреймворк исполнен минимализма и создан по трём базовым принципам — элегантность, производительность, прагматизм.

### Производительность

[](#производительность)

PHP 7 замечательный язык с достойноной производительностью, но разработчики популярных фреймворков так увлеклись подменяемостью и универсальностью, попутно добавляя всё больше runtime-абстракций, что не заметили как перевернули всё с ног на голову. Зачастую можно видеть, что есть обширный Registry модулей, которые при каждом запросе перебираются поочередно и каждый что-то вносит в состояние.

В результате имеем то что имеем. Среднестатический сайт выдерживает от силы 50 запросов в секунду (без кеширования ответов в nginx) на выделенном сервере занимающем пару юнитов в стойке.

#### Принцип нулевого бутстрапа

[](#принцип-нулевого-бутстрапа)

Это backtrace из *Hello world!* контроллера, просто сравните его с вереницей вызовов в тех фреймворках, которые вам доводилось использовать. Вы будете удивлены.

```
1	0.0000	397392	{main}( )	.../index.php:0
2	0.0006	444616	Zer0\HTTP\HTTP->handleRequest( )	.../index.php:22
3	0.0008	520416	MyProject\HTTP\Controllers\Index->indexAction( )	.../HTTP.php:136

```

Мы не делаем лишних действий в runtime и не выполняем код без требования.

Например, у нас считается моветоном обращаться к сессии (считывать её из хранилища), если того не требует бизнес-логика выполнения данного конкретного HTTP-запроса. Равно как и обращаться к хранилищу сессий на запись, если в данных сессии не было изменений.

Composer реализован так, что подключенные зависимости могут бесстыдно добавлять файлы в безусловную автозагрузку, поэтому в папке cli отдельный composer.json для таких пакетов как phinx, которые не используются в веб-части. В cli производительность не играет никакой роли и там нет проблемы подключать всё что угодно, а основное приложение мы содержим в чистоте.

#### PHP больше не рождён умирать

[](#php-больше-не-рождён-умирать)

Исторически PHP воспринимался как интерпретатор, который полностью сбрасывает своё состояние после завершения обработки запроса. Однако, намного более производительным вариантом является истинный FastCGI, когда bootstrap-фаза в рабочем процессе выполняется единожды и затем идёт последовательная обработка входящих запросов. Отсюда и приставка Fast в FastCGI. Классический же CGI лишён возможности проводить bootstrap-фазу единожды.

- Мы не используем exit() и die()
- Вместо Fatal error мы пользуемся исключениями.
- Константы не должны быть запросозависимыми.

#### Близость к PHP

[](#близость-к-php)

В большинстве фреймворков (не будем тыкать пальцем), для обращения к параметру запроса несколько десятков классов, создать легион объектов и потом вызвать метод, который вызовет метод, который вызовет метод, который обратится к коллекции параметров запроса, проверит есть ли параметр и вернет значение или параметр *$default*. Это очень непроизводительность, неинтуитивно и громоздко

Мы пишем просто `$_GET['name'] ?? 'John Doe'`. Да, когда-то не было оператора *??* и приходилось либо тащить везде *isset()* либо использовать методы-хелперы. Но те времена канули в лету.

#### Тесты

[](#тесты)

Unit и интеграционные тесты — это замечательно. Чем больше кода покрыто тестами, тем меньше шансов что-то сломать и не заметить. Однако, тесты должны быть быстрыми, а главное поддерживаешь многопоточное выполнение.

### Прагматизм

[](#прагматизм)

#### Отношение к версиям PHP

[](#отношение-к-версиям-php)

Мы всегда ориентируемся на последнюю стабильную версию PHP (в данный момент это *7.2.10*), поддержке более старых версий внимание не уделяется, так мы можем использовать последние новинки и при этом обойтись без условий с *PHP\_VERSION*.

#### Code Style

[](#code-style)

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

> Команда `make fmt` (цель `fmt` также включена в `all`) в dev-окружении автоматически форматирует все PHP, JS и CSS исходники.

#### Типизация

[](#типизация)

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

`public function validate(?string $token = null): bool`

Это позволяет избежать множества багов. Также крайне желательно указывать `declare(strict_types=1);`в начале каждого файла.

Мы не используем `loose comparison` (операторы `==` и `!=`) почти никогда. Редкое исключение — когда нужно сравнить два объекта по типу и свойствам, а не по ссылке.

Также мы не приводим строки к boolean, float и integer по причине некорректного отождествления, которое сложилось в PHP исторически. Так,

```
php > var_dump(('1helloWorld' == 1);
bool(true)

```

Что может вести к нехорошим последствиям при обработке пользовательского ввода.

Брокеры
-------

[](#брокеры)

По своей сути они являются фабриками компонентов и библиотек. Например, `$app->factory('Redis')` вернет объект драйвера Redis с настройками взятыми из `conf/Redis`. Метод get() принимает необязательный параметр с именем конфигурации, что позволяет иметь несколько конфигураций одного компонента.

Есть брокеры, которые хранят объект после первого создания, например, `PDO` или `SessionStorage`. Другие же, такие как `Session`, при каждом вызове `get()` порождают новый объект.

#### Добавление собственного брокера

[](#добавление-собственного-брокера)

В конфигурацию Main нужно добавить:

```
brokers:
  MyCustomBroker: \My\Custom\Broker

```

И создать соответующий класс наследующийся \\Zer0\\Brokers\\Base.

Таким же образом можно подменить и брокеры, которые лежат в `\Zer0\Brokers\*` и не нуждаются в объявлении в конфиге.

###  Health Score

27

—

LowBetter than 49% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity20

Limited adoption so far

Community15

Small or concentrated contributor base

Maturity47

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~63 days

Recently: every ~44 days

Total

10

Last Release

1635d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/031503de2dadf7cd9862134512dd76b6ffc2f02789d816a2cb33b6645e9e3bc0?d=identicon)[kakserpom](/maintainers/kakserpom)

---

Top Contributors

[![kakserpom](https://avatars.githubusercontent.com/u/175350?v=4)](https://github.com/kakserpom "kakserpom (75 commits)")

---

Tags

highloadZer0

### Embed Badge

![Health badge](/badges/zer0-framework-core/health.svg)

```
[![Health](https://phpackages.com/badges/zer0-framework-core/health.svg)](https://phpackages.com/packages/zer0-framework-core)
```

###  Alternatives

[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k36.7M259](/packages/laravel-dusk)[doppar/framework

The Doppar Framework

366.7k8](/packages/doppar-framework)[lion/bundle

Lion-framework configuration and initialization package

122.2k1](/packages/lion-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
