Skip to content

Feature DotPaths

github-actions[bot] edited this page Jul 16, 2026 · 1 revision

🗺️ Точечные пути

← Возможности · Главная · Сравнение

Чтение и запись вложенных значений по пути «a.b.c» — как в joomla/registry и dflydev/dot-access-data, но быстрее обоих: простые ключи идут одним hash-lookup, разбор путей кэшируется.

Принцип работы

  • set('db.pgsql.host', '…') — создаёт промежуточные ветки; скаляр посреди пути перезаписывается веткой.
  • get('db.pgsql.host', $default) — обрыв пути (отсутствие сегмента, скаляр или null посреди пути) возвращает $default.
  • Null-значение на листе отличается от отсутствующего ключа: get() вернёт null-значение, а не default; has() вернёт true.
  • Плоский ключ с точкой в имени (['a.b' => 1]) имеет приоритет над путём.
  • forget('a.b') — удаляет лист; обрыв пути — тихий no-op.
  • merge($layer) — рекурсивное слияние слоя поверх текущих значений.
  • extract('db') — подветка как независимый реестр.
use CloudCastle\Registry\Registry;

$config = new Registry(['db' => ['host' => 'localhost']]);

$config->set('db.port', 5432);
$config->get('db.host');           // 'localhost'
$config->get('db.user', 'app');    // 'app' — default
$config->has('db.port');           // true

$config->merge(['db' => ['host' => 'prod']]);
$config->get('db.host');           // 'prod', порт сохранён

$db = $config->extract('db');      // независимая копия подветки

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

Разбор пути (explode + выделение листа) выполняется один раз на уникальный ключ и кэшируется (bounded-кэш на 10 000 путей со сбросом при переполнении — память не растёт). Горячий шаг навигации — isset-суперинструкция VM.

Операция Registry joomla dflydev
Чтение пути (3 уровня) ~2.9M ops/s ~2.1M ~1.9M
Проверка пути (has) ~3.2M ops/s ~2.6M ~1.9M
Запись пути ~2.5M ops/s ~1.6M ~1.7M

См. также

Clone this wiki locally