
# Uvod
Phasis je mehanizem PHP, napisan izključno v JavaScript. V gostiteljskem procesu PHP leksikalno analizira, razčlenjuje in izvaja ECMAScript — brez `exec('node …')`, FFI ali lastne binarne razširitve. Zahteva tri standardne razširitve PHP: `ext-mbstring`, `ext-bcmath` in `ext-curl` (privzeti transport `fetch()`). `ext-intl` in `ext-openssl` sta izbirni. Za gradnje brez `bcmath` glejte [Uvod](https://phasis.inline0.dev/sl/docs/getting-started).

- **Vdeljiv** — dodajte izvajalno okolje JS v katerokoli aplikacijo PHP, ogrodje ali orodje CLI prek razreda `Phasis\Engine`.
- **Skladen s specifikacijo** — opravi uradno zbirko test262 pri 100 %, v vseh kategorijah in brez izpuščenih testov.
- **Spletni API-ji** — celoten **Web Platform Pack** (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), celoten **Fetch Pack** (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, celotni WHATWG Streams, navigator), poleg `crypto` + `SubtleCrypto`, `WebSocket`, `XMLHttpRequest` in prave zanke dogodkov. Uspešnih je 100 % uvoženih testov Web Platform.
- **Sodobne funkcije** — funkcije s puščico, razredi, async/await, Promises, generatorji, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays in polna podpora za module.
- **Sodelovanje PHP↔JS** — posredujte skalarje in polja PHP v JS (polja se kopirajo), zaprtja PHP povežite kot funkcije JS ter funkcije JS kličite iz PHP. Objektov PHP še ni mogoče deliti z JS; glejte [Skupni objekti](https://phasis.inline0.dev/sl/docs/interop/shared-objects).

## Zakaj obstaja Phasis

Aplikacije PHP, ki morajo izvajati uporabniško podan JavaScript — mehanizmi za predloge, nadomestni sloji za SSR v ospredju, pravila za preverjanje podatkov, izolirana okolja za vsebino in izvajalniki brezglavih testov — navadno zaženejo Node.js kot podproces ali funkcije sploh ne podprejo. Obe možnosti povečata operativno zapletenost: drugo izvajalno okolje, mejo za serializacijo, mrežo cevi podprocesov ter zahtevno in tvegano uvajanje na deljenem gostovanju.

Phasis zapolni to vrzel. Vaša koda PHP lahko leksikalno analizira, razčlenjuje in izvaja JavaScript samo z PHP 8.2+ ter `mbstring`, `bcmath` in `curl`. Mehanizem je na voljo kot paket Composer in ponuja majhen, enoten vmesnik API.

## Kaj omogoča

- Implementira celotno standardno knjižnico ECMAScript: `Array`, `String`, `Object`, `Math`, `JSON`, `Date`, `RegExp`, `Map`, `Set`, `Promise`, `Proxy`, `Reflect`, `Symbol`, `BigInt`, `TypedArray`, `Temporal`, `Intl`, generatorje, asinhrone iteratorje in module.
- Ponuja API-je **Web Platform**, ki jih knjižnice JS iz resničnega sveta preverijo vnaprej: `URL`, `URLSearchParams`, `TextEncoder`/`TextDecoder`, `atob`/`btoa`, `structuredClone`, `performance`, `DOMException`. Celoten nabor najdete v razdelku [Spletni API-ji](https://phasis.inline0.dev/sl/docs/compatibility/web-apis).
- Vključuje **`fetch`** s celotno družino Fetch — `Request`, `Response`, `Headers`, porabnike telesa, `AbortController`/`AbortSignal`, `Blob`, `File`, `FormData`, `EventTarget`/`Event` in celotne WHATWG Streams (`ReadableStream`, `WritableStream`, `TransformStream`, BYOB, strategije čakalne vrste). Pravi HTTP deluje takoj po namestitvi prek PHP in njegovega `ext-curl`.
- Vključuje **`crypto`** in celoten `SubtleCrypto` (družino SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), **`WebSocket`** (RFC 6455 in zamenljiv transport) ter **`XMLHttpRequest`** (zgrajen na istem transportu za fetch).
- Vključuje pravo **zanko dogodkov**: `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask` ter Stage-3 `AsyncContext` za prenos vrednosti prek asinhronih meja.
- Podpira sodobno sintakso — destrukturiranje, razširjanje/preostanek, izračunane lastnosti, izbirno veriženje, zlivanje z ničelno vrednostjo, predloge nizov, označene predloge, razrede (z zasebnimi polji, statičnimi bloki, dekoratorji) in await na najvišji ravni.
- Pretvarja vrednosti prek meje PHP↔JS. Skalarji in polja se kopirajo navznoter, klicne funkcije PHP postanejo funkcije JS, rezultati JS pa se vrnejo kot skalarji in polja PHP. Natančna pravila najdete v razdelku [Pretvorba vrednosti](https://phasis.inline0.dev/sl/docs/interop/values).
- Izvaja se pod nadzorom gostitelja. Gostitelj upravlja transport `fetch` in kljuke pravilnikov, zanka dogodkov pa deluje z navideznim časom; fiksna zgornja meja klicnega sklada ustavi neskončno rekurzijo. Omejitev števila iteracij zank obstaja, vendar se še ne uveljavlja za zanke v bajtkodni navidezni napravi; omejitev dolžine nizov, izhoda ali časa izvajanja ni. Glejte [API: setLimit](https://phasis.inline0.dev/sl/docs/api#setlimit).
- Preverjeno je glede na Node.js (V8). CI ob vsakem potisku v `main` in vsakem zahtevku za združitev zažene teste enot in testne zbirke z orakljem; teste Web Platform ter testne zbirke priljubljenih paketov zažene ob spremembi izvorne kode mehanizma. Celotno matriko test262 zaženemo ročno in njen posnetek shranimo v `COMPAT.md`. Glejte [Združljivost](https://phasis.inline0.dev/sl/docs/compatibility).

## Kaj ni

Phasis ni prevajalnik JIT. Gre za tolmač s sprehodom po drevesu in priložnostno bajtkodno navidezno napravo. Pri opravilih, omejenih s klici, pričakujte približno 100-krat daljši čas izvajanja kot pri V8. V zameno dobite nič odvisnosti, čisti PHP in izvajanje pod nadzorom gostitelja — idealno za vdelavo JavaScript v aplikacije PHP, kjer sta pravilnost in izolacija pomembnejši od surove prepustnosti.

## Kje začeti

- [Uvod](https://phasis.inline0.dev/sl/docs/getting-started) — namestite in zaženite svoj prvi skript.
- [CLI](https://phasis.inline0.dev/sl/docs/cli) — `bin/phasis` za izvajanje datotek, vrednotenje izvorne kode in izpis AST-ja.
- [API](https://phasis.inline0.dev/sl/docs/api) — vdelajte `Phasis\Engine` v svojo aplikacijo PHP.
- [Sodelovanje](https://phasis.inline0.dev/sl/docs/interop) — posredujte vrednosti PHP in klicne funkcije v JavaScript.
- [Združljivost](https://phasis.inline0.dev/sl/docs/compatibility) — pokritost z test262 in podprte funkcije.
- [Razčlenjevalnik](https://phasis.inline0.dev/sl/docs/parser) — razčlenite JavaScript v tipiziran AST ali ESTree, ne da bi ga izvajali.
- [Oblikovalnik](https://phasis.inline0.dev/sl/docs/formatter) — oblikujte JavaScript, JSON in CSS z razporeditvijo, združljivo s prettier.
- [Napredno](https://phasis.inline0.dev/sl/docs/advanced) — arhitektura, bajtkodna navidezna naprava, primerjalna merila in model testiranja z orakljem.
