Download the PHP package ktav-lang/ktav without Composer
On this page you can find all versions of the php package ktav-lang/ktav. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download ktav-lang/ktav
More information about ktav-lang/ktav
Files in ktav-lang/ktav
Package ktav
Short Description PHP bindings for Ktav — a plain configuration format with three rules, zero indentation, and no required quoting (quoted keys are supported). FFI over the reference Rust crate; no extension compilation on the consumer side.
License MIT OR Apache-2.0
Homepage https://github.com/ktav-lang/php
Informations about the package ktav
ktav — PHP bindings
Languages: English · 简体中文
Playground: convert JSON / YAML / TOML / INI ⇄ Ktav in your browser at ktav-lang.github.io.
PHP bindings for the Ktav configuration format. Thin wrapper around the reference Rust parser, loaded at runtime through the PHP FFI extension — no PHP extension to compile, no PECL install. Plain Composer dependency, the native binary is fetched on first call.
Requires PHP 7.4+ with ext-ffi enabled (default in CLI; web SAPIs
need ffi.enable=1 in php.ini).
Install
Quick start
Parse — read typed values straight off the array
Build & render — construct a document in code
A complete runnable example lives in examples/basic.php.
API
| Method | Purpose |
|---|---|
Ktav::loads(string $src): mixed |
Parse a Ktav document. |
Ktav::loadsStrict(string $src): mixed |
Parse with strict numeric spelling checks. |
Ktav::dumps(array $value): string |
Render an associative array as Ktav text. |
Ktav::dumpsForceStrings(array $value): string |
Render like dumps, but coerce every leaf scalar to a String. |
Ktav::emitCanonical(array $value): string |
Render a value as deterministic canonical form. |
Ktav::format(string $src): string |
Normalise a document's spelling, keeping comments. |
Ktav::canonicalFromSource(string $src): string |
Canonicalize source directly, preserving compound shape that PHP values may collapse (for example, a: {} stays a: {} while loads represents the empty Object as []). Drops comments and blank lines. |
Ktav::nativeVersion(): string |
Version of the loaded ktav_cabi. |
dumpsForceStrings flattens integers, floats, booleans and null to
their textual form via the raw marker (::); objects and arrays keep
their structure, since only leaves are coerced. The result parses back
through loads as the same set of String scalars — useful when a
downstream consumer needs string-only values.
Formatting
Ktav::format() takes Ktav source text and returns Ktav source
text. It normalises structure to canonical form (§ 5.9) while keeping
the trivia the canonical writer drops:
Every comment survives verbatim — Ktav has no trailing comments (§ 3.4: a comment owns a whole line), so attachment is unambiguous. Blank lines survive as a grouping hint, but a run of two or more collapses to exactly one and blank padding just inside a bracket is dropped, which makes the transform a fixed point: formatting already-formatted text changes nothing. Key order is never changed — canonical form has no sorting rule, and reordering keys would make review diffs worse.
Errors
KtavException is thrown on any parse or render failure. Beyond a
human-readable getMessage(), it carries the nine structured fields of
the core's error envelope:
The full set is getError(), getReason(), getErrorLine(),
getLineText(), getSpan(), getPath(), getBody(),
getCanonical(), getSpecSection(). Absent information is null,
never a missing accessor, so a caller can read any field without
checking the error class first.
getPath() is an array of exact decoded key segments, never a joined
string: a key literally named a.b is one segment and cannot be
confused with a two-segment path.
Two writer rejections are named apart — "UnrepresentableAt" when the
writer can say which node is at fault (it fills getPath() too), and
"Unrepresentable" when it cannot. The reason code is the same in
both, so matching on getReason() is enough when you only need to know
that a write was refused.
getErrorLine() rather than getLine(), because PHP declares
Exception::getLine() final.
Type mapping
| Ktav | PHP |
|---|---|
null |
null |
true / false |
bool |
| bare integer | int if it fits, else string (PHP has no native bigint — wrap your own GMP / BCMath if you need arithmetic). |
| bare decimal | float |
| other scalar | string |
[ ... ] |
sequential array |
{ ... } |
associative array (insertion order preserved) |
To emit an arbitrary-precision integer, wrap the digit string yourself:
['big' => ['$i' => '9999999999999999999']] — same envelope used on the
wire between PHP and the native side.
Key escaping
Since spec 0.6.4 a literal . or : inside a key segment is written
with a backslash:
A literal backslash in a key is \\.
How the native library is resolved
On first call:
KTAV_LIB_PATHenv var, if set.- User cache —
<userCache>/ktav-php/v<version>/<asset>, downloaded on a previous call. - GitHub Release download — fetched once from
github.com/ktav-lang/php/releases/download/v<version>/<asset>and cached under (2). Requires network on first call after install.
<userCache> is %LOCALAPPDATA% on Windows, ~/Library/Caches on
macOS, $XDG_CACHE_HOME or ~/.cache on Linux.
Runtime support
- Supported PHP: 7.4 / 8.0 / 8.1 / 8.2 / 8.3+. CI tests PHP 7.4, 8.2 and 8.3 on Linux, macOS and Windows.
- Prebuilt binaries for:
linux/amd64,linux/arm64,darwin/amd64,darwin/arm64,windows/amd64,windows/arm64. - Linux distros must use glibc 2.17+ (zigbuild baseline). Alpine (musl) support is planned.
License
MIT OR Apache-2.0 — see LICENSE-APACHE.
Other Ktav implementations
spec— specification + conformance suiterust— reference Rust crate (cargo add ktav)csharp— C# / .NET (dotnet add package Ktav)golang— Go (go get github.com/ktav-lang/golang)java— Java / JVM (io.github.ktav-lang:ktavon Maven Central)js— JS / TS (npm install @ktav-lang/ktav)python— Python (pip install ktav)
All versions of ktav with dependencies
ext-ffi Version *
ext-json Version *