
# Johdanto
Phasis on puhdas-PHP JavaScript-moottori. Se jäsentää leksikaalisesti, jäsentää ja suorittaa ECMAScript-koodia isännän PHP-prosessissa ilman `exec('node …')`-toimintoa, FFI:tä tai mukautettua binäärilaajennusta. Se tarvitsee kolme tavallista PHP-laajennusta: `ext-mbstring`, `ext-bcmath` ja `ext-curl` (oletusarvoinen `fetch()`-siirtotapa). `ext-intl` ja `ext-openssl` ovat valinnaisia. Katso [Aloittaminen](https://phasis.inline0.dev/fi/docs/getting-started) koontiversioita varten, joista `bcmath` on jätetty pois.

- **Upotettava** — lisää JS-ajoympäristö mihin tahansa PHP-sovellukseen, kehykseen tai CLI-työkaluun `Phasis\Engine`-luokan avulla.
- **Määrittelyn mukainen** — läpäisee virallisen test262-testisarjan kattavuudella 100 %, kaikissa luokissa ilman ohituksia.
- **Verkko-API:t** — täysi **Web Platform -paketti** (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), täysi **Fetch-paketti** (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, täydet WHATWG Streams -rajapinnat, navigator) sekä `crypto` + `SubtleCrypto`, `WebSocket`, `XMLHttpRequest` ja oikea tapahtumasilmukka. 100 % tuoduista Web Platform Test -testeistä läpäistään.
- **Moderni rajapinta** — nuolifunktiot, luokat, async/await, Promises, generaattorit, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays ja täysi moduulituki.
- **PHP↔JS-yhteentoimivuus** — välitä PHP-skalaarit ja taulukot kohteeseen JS (taulukot kopioidaan), sido PHP-sulkeumat JS-funktioiksi ja kutsu JS-funktioita kohteesta PHP. PHP-olioita ei vielä voi jakaa kohteen JS kanssa; katso [Jaetut oliot](https://phasis.inline0.dev/fi/docs/interop/shared-objects).

## Miksi Phasis on olemassa

PHP-sovellukset, joiden täytyy suorittaa käyttäjän antamaa JavaScript-koodia — kuten mallinnusmoottorit, käyttöliittymän SSR-sovittimet, tietojen validointisäännöt, sisällön hiekkalaatikot ja headless-testiajurit — kutsuvat yleensä ulkoisesti kohdetta Node.js tai jättävät ominaisuuden toteuttamatta. Kumpikin vaihtoehto lisää ylläpidon monimutkaisuutta: toisen ajoympäristön, sarjallistamisrajan, aliprosessien putkiverkoston ja haastavan käyttöönoton jaetuissa palveluympäristöissä.

Phasis paikkaa tämän puutteen. PHP-koodisi voi jäsentää leksikaalisesti, jäsentää ja suorittaa kohdetta JavaScript käyttäen vain kohdetta PHP 8.2+ sekä kohteita `mbstring`, `bcmath` ja `curl`. Moottori toimitetaan Composer-pakettina, ja se tarjoaa pienen, yhtenäisen API-rajapinnan.

## Mitä se tekee

- Toteuttaa koko ECMAScript-standardikirjaston: `Array`, `String`, `Object`, `Math`, `JSON`, `Date`, `RegExp`, `Map`, `Set`, `Promise`, `Proxy`, `Reflect`, `Symbol`, `BigInt`, `TypedArray`, `Temporal`, `Intl`, generaattorit, asynkroniset iteraattorit ja moduulit.
- Toimittaa **Web Platform** -rajapinnat, joiden olemassaolon oikeat JS-kirjastot tarkistavat ennakkoon: `URL`, `URLSearchParams`, `TextEncoder`/`TextDecoder`, `atob`/`btoa`, `structuredClone`, `performance`, `DOMException`. Katso [Verkko-API:t](https://phasis.inline0.dev/fi/docs/compatibility/web-apis) koko rajapinnasta.
- Toimittaa **`fetch`**-paketin koko Fetch-toimintoperheellä — `Request`, `Response`, `Headers`, rungon lukutoiminnot, `AbortController`/`AbortSignal`, `Blob`, `File`, `FormData`, `EventTarget`/`Event` sekä täydet WHATWG Streams -rajapinnat (`ReadableStream`, `WritableStream`, `TransformStream`, BYOB ja jonotusstrategiat). Oikea HTTP toimii heti käyttövalmiina kohteen PHP `ext-curl`-toiminnon kautta.
- Toimittaa **`crypto`**-rajapinnan ja koko `SubtleCrypto`-kokonaisuuden (SHA-perhe, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), **`WebSocket`**-rajapinnan (RFC 6455 sekä vaihdettava siirtotapa) ja **`XMLHttpRequest`**-rajapinnan (joka käyttää samaa fetch-siirtotapaa).
- Toimittaa oikean **tapahtumasilmukan**: `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask` sekä Stage-3-rajapinnan `AsyncContext` arvojen välittämiseen asynkronisten rajojen yli.
- Tukee modernia syntaksia: hajotelman määritykset, levitys/rest, lasketut ominaisuudet, valinnainen ketjutus, null-arvon yhdistäminen, mallimerkkijonot, nimikoidut mallimerkkijonot, luokat (yksityisine kenttineen, staattisine lohkoineen ja koristeineen) sekä ylätason await.
- Muuntaa arvoja kohteiden PHP ja JS välillä. Skalaarit ja taulukot kopioidaan sisään, kohteen PHP kutsuttavat muunnetaan JS-funktioiksi, ja kohteen JS tulokset palautetaan PHP-skaalareina ja -taulukoina. Tarkat säännöt ovat sivulla [Arvojen muuntaminen](https://phasis.inline0.dev/fi/docs/interop/values).
- Suoritus tapahtuu isännän hallinnassa. Isäntä omistaa `fetch`-siirtotavan ja käytäntöliitännät, tapahtumasilmukka toimii virtuaaliajassa ja kiinteä kutsupinon yläraja pysäyttää hallitsemattoman rekursion. Silmukoiden iteraatiorajoitus on olemassa, mutta sitä ei vielä valvota tavukoodi-VM:n suorittamissa silmukoissa. Merkkijonon pituudelle, tulosteelle tai seinäajalle ei ole rajoituksia; katso [API: setLimit](https://phasis.inline0.dev/fi/docs/api#setlimit).
- Varmennetaan kohteen Node.js (V8) avulla. CI suorittaa yksikkö- ja oraakkelitestit jokaisella kohteeseen `main` tulevalla päivityksellä ja jokaisella vetopyynnöllä sekä Web Platform Tests -testit ja suosittujen pakettien testisarjat aina, kun moottorin lähdekoodi muuttuu. Koko test262-testimatriisi suoritetaan käsin, ja sen tilannekuva tallennetaan kohteeseen `COMPAT.md`. Katso [Yhteensopivuus](https://phasis.inline0.dev/fi/docs/compatibility).

## Mitä se ei ole

Phasis ei ole JIT-kääntäjä. Se on puuta kulkeva tulkki, jossa on tilaisuuden mukaan käytettävä tavukoodi-VM. Odota noin 100× kohteen V8 suoritusajasta suoritusvuoron valintaan painottuvissa kuormissa. Vastineeksi saat nolla riippuvuutta, puhtaan kohteen PHP ja isännän hallitseman suorituksen — täydellinen tapa upottaa JavaScript kohteen PHP sovelluksiin, joissa oikeellisuus ja eristys ovat raakaa suorituskykyä tärkeämpiä.

## Mistä aloittaa

- [Aloittaminen](https://phasis.inline0.dev/fi/docs/getting-started) — asenna ja suorita ensimmäinen skriptisi.
- [CLI](https://phasis.inline0.dev/fi/docs/cli) — `bin/phasis` tiedostojen suorittamiseen, lähdekoodin arviointiin ja AST:n tulostamiseen.
- [API](https://phasis.inline0.dev/fi/docs/api) — upota `Phasis\Engine` PHP-sovellukseesi.
- [Yhteentoimivuus](https://phasis.inline0.dev/fi/docs/interop) — välitä PHP-arvoja ja kutsuttavia kohteeseen JavaScript.
- [Yhteensopivuus](https://phasis.inline0.dev/fi/docs/compatibility) — test262-kattavuus ja tuetut ominaisuudet.
- [Jäsennin](https://phasis.inline0.dev/fi/docs/parser) — jäsennä JavaScript tyypitetyksi AST:ksi tai ESTreeksi suorittamatta sitä.
- [Muotoilija](https://phasis.inline0.dev/fi/docs/formatter) — muotoile JavaScript, JSON ja CSS Prettier-yhteensopivalla asettelulla.
- [Lisäominaisuudet](https://phasis.inline0.dev/fi/docs/advanced) — arkkitehtuuri, tavukoodi-VM, vertailutestit ja oraakkelitestauksen malli.
