4: Syntax & Structuur
Phlo compileert .phlo bronbestanden naar gewone PHP-klassen en gegenereerde middelen. De syntaxis is PHP-achtig, maar zonder puntkomma's aan het einde van uitspraken.
4.1: Bestandsstructuur
Een .phlo-bestand kan top-level controllercode en knooppunten bevatten:
routefunctionpropstaticmethodview<style><script>
Voorbeeld:
route both GET home => view($this)
prop title = 'Welkom'
view:
<h1>$this->title</h1>4.2: Statements en de lijnparser
Statements eindigen bij een regelafbreking, niet bij een puntkomma:
$count = 1
if ($active) $count++
Dit werkt omdat de compiler 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 het volledig denken aan puntkomma's. Vraag alleen "is mijn verklaring op deze regel compleet?" 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 continuatie, 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 parser voor knooppunten op bestandsniveau houdt meerregelige knooppuntlichamen bij door haakjes te tellen, niet vierkante haken. Een meerregelige
prop x => [ ... ]beëindigt het knooppunt na de eerste regel en de resterende regels worden losstaande controllercode (Controller moet op één plek zijn). Open meerregelige knooppuntlichamen 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 controllercode voor lichte initialisatie. Plaats verzoeklogica in routes en methoden in plaats daarvan.
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 compiler herschrijft
%nameOVERAL in een.phlo-bestand, inclusief binnen stringliteral. Een pagina die probeerde de letterlijke tekst%sessionaf 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
Berekenende props worden gegenereerd als getters en kunnen worden gelezen als een property:
$this->fullName4.6: Methoden
Enkel-regel methode:
method label($value) => ucfirst($value)
Meerdere-regels 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: Statics
Statische waarde:
static table = 'users'
Statische methode:
static label($value) => ucfirst($value)
Aanroep:
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 per-app responswrapper.
debug: true (instellen in www/app.php) schakelt uitgebreide debug-uitvoer in; runtime-fouten worden gelogd naar data/errors.json.