4: Syntax & Structuur
Phlo transpileert .phlo bronbestanden naar gewone PHP-klassen en gegenereerde assets. De syntaxis is PHP-achtig, maar zonder puntkomma's aan het einde van statements.
4.1: Bestandstructuur
Een .phlo-bestand kan top-level controllercode en knooppunten bevatten:
routefunctionpropstaticmethodview<style><script>
Voorbeeld:
route both GET home => view($this)
prop title = 'Welcome'
view:
<h1>$this->title</h1>4.2: Statements en de lijnparser
Uitspraken eindigen bij een regelafbreking, niet bij een puntkomma:
$count = 1
if ($active) $count++
Dit werkt omdat de transpiler een ; toevoegt aan elke regel en deze alleen verwijdert waar de regel duidelijk doorgaat. De volledige set regels:
- Elke regel krijgt een
;aan het einde. - Die
;wordt verwijderd wanneer de regel eindigt met(,[,{,},,of.. Dit zijn impliciete continuaties: een openingshaakje, een achterblijvende komma in een argumentenlijst, of een concatenatie die breekt na de.. - Een regel die eindigt met een enkele backslash
\is een expliciete continuatie: de parser verwijdert de backslash en de puntkomma en voegt de regel samen met de volgende. Gebruik dit voor alles wat niet onder de impliciete set valt, zoals een meerregelige ternary:
$label = $visitors === 1 \
? 'visitor' \
: 'visitors'
- Lege regels krijgen nooit een
;.
Het mentale model: stop met denken aan puntkomma's. Vraag alleen "is mijn verklaring compleet op deze regel?" Zo niet, eindig de regel met een van ( [ { , . (wat van nature gebeurt in de meeste meerregelige code) of met een expliciete \.
Zonder een impliciete of expliciete voortzetting, wordt elke regel zijn eigen verklaring. Daarom moet in meerregelige aanroepen elke argumentregel eindigen met een komma, inclusief de laatste:
apply (
title: 'Done',
main: '<p>Ready</p>',
)
Les. De node-parser op bestandsniveau houdt meerregelige node-lichamen bij door haakjes te tellen, niet vierkante haken. Een meerregelige
prop x => [ ... ]beëindigt de node na de eerste regel en de resterende regels worden losstaande controllercode (Controller moet op één plek zijn). Open meerregelige node-lichamen met een haakje:prop x => arr(...)ofprop x => array_merge(...).
4.3: Controller code
Code op het hoogste niveau dat geen node is, wordt controllercode van de gegenereerde klasse. Die code wordt uitgevoerd wanneer de instantie voor het eerst wordt opgehaald.
prop ready = false
$this->ready = true
Gebruik controller code voor lichte initialisatie. Plaats de verzoeklogica in routes en methoden.
4.4: Instanties
Gebruik %name om een Phlo-object op te halen via de instance manager:
%payload->name
%session->user
%creds->mysql->database
De instantie wordt lui aangemaakt en vervolgens hergebruikt binnen het verzoek.
Les. De transpiler herschrijft
%nameOVERAL in een.phlo-bestand, inclusief binnen stringliteral. Een pagina die de letterlijke tekst%sessionprobeerde af te drukken in een codevoorbeeld verzondphlo('session')naar zijn bezoekers. Voorbeeldcode die letterlijk moet blijven, behoort in externe bestanden (.txt,.md) die tijdens runtime worden geladen, nooit in.phlostringliteral.
4.5: Props
Statische prop:
prop title = 'App'
Berekenende prop:
prop fullName => $this->first.' '.$this->last
Berekenbare props worden gegenereerd als getters en kunnen als een eigenschap worden gelezen:
$this->fullName4.6: Methoden
Enkele regel methode:
method label($value) => ucfirst($value)
Multiline methode:
method label($value){
if (!$value) return void
return ucfirst($value)
}4.7: Functies
Je definieert globale functies met function:
function initials($name){
return strtoupper(substr($name, 0, 1))
}
Gebruik dit spaarzaam. Voor app-code is een reguliere app-klasse meestal beter; alleen framework-brede helpers horen in een runtime resource thuis.
4.8: Statica
Statische waarde:
static table = 'users'
Statische methode:
static label($value) => ucfirst($value)
Oproep:
user::label('jordi')4.9: Strings en operatoren
Strings en operatoren volgen PHP:
$name = 'Jordi'
$title = "Hello $name"
$active = $count > 0 && !$archived
Gebruik void voor een lege string wanneer dat de intentie duidelijk maakt.
4.10: Benamde argumenten
Genomineerde argumenten werken zoals in PHP en houden aanroepen leesbaar:
%DB->load (
table: 'users',
where: 'active=1',
order: 'name',
)4.11: Foutafhandeling en JSON-antwoorden
error('message', $code = 500) beëindigt een verzoek met een status. Het gooit (geen return nodig), en de engine rendert het om aan het verzoek te voldoen:
- een async/SPA verzoek krijgt
apply(error: 'message')(phlo.js toont het); - een JSON context (de route die
%security->apiaanroept, of de client stuurdeAccept: application/json) krijgt een JSON body{"error": "message"}met de statuscode; - anders de HTML foutpagina (de volledige debugpagina wanneer
debug: true, een minimale pagina anders).
if (!$record) error('Record not found', 404)
Klantfouten ($code < 500) behouden hun bericht; serverfouten (>= 500) blijven algemeen ("Error") tenzij debug: true, zodat interne onopgevangen uitzonderingen standaard niet worden blootgesteld.
Voor een succesvolle JSON-respons gebruik je output($data, code:): een array wordt automatisch gecodeerd en code stelt de status in. Een JSON API route gebruikt daarom output() voor resultaten en error() voor mislukkingen, zonder een per-app responswrapper.
debug: true (instellen in www/app.php) schakelt gedetailleerde debug-uitvoer in; runtime-fouten worden gelogd naar data/errors.json.