2 — Sintassi e variabili in PHP
Obiettivo del modulo. Fornire una conoscenza esaustiva della sintassi di base di PHP, del modello di variabili e tipi, delle costanti e degli operatori, con esempi pronti all’uso e un esercizio guidato (calcolo area e perimetro di un rettangolo) implementato in più varianti (script semplice, form web, CLI, versione “robusta” con validazione e test).
Indice
-
Struttura base di un file PHP
-
Tag PHP e integrazione HTML
-
Modalità di esecuzione (CLI / server integrato / server web)
-
Direttive utili per sviluppo (error reporting, display_errors)
-
Variabili: binding, naming, scope
-
Tipi di dato in PHP (primitivi e compound)
-
Type juggling, casting esplicito e declare(strict_types=1)
-
Costanti: const vs define()
-
Operatori (aritmetici, confronto, logici, stringa, bitwise, null coalescing, spaceship, ecc.)
-
Stringhe: concatenazione, interpolazione, heredoc/nowdoc
-
Superglobals e input (sicurezza e validazione)
-
Buone pratiche e anti-pattern
-
Esercizio completo: Area e perimetro del rettangolo — 4 versioni (snippet + spiegazioni)
-
Test, logging e error handling (sintesi)
-
Riferimenti e letture consigliate
1 — Struttura base di un file PHP
Un file PHP è un file di testo con estensione .php che contiene codice PHP racchiuso tra tag di apertura e tag di chiusura. La struttura minima:
Si possono mescolare HTML e PHP:
Nota: preferire sempre <?php ... ?> per compatibilità. Il short-tag <? è deprecato/oscillante in alcune configurazioni; il short-echo <?= ... ?> è disponibile di default nelle versioni recenti di PHP ed è comodo per l’output rapido.
2 — Tag PHP e integrazione HTML
-
<?php ... ?> blocco PHP standard.
-
<?= expr ?> equivalente a <?php echo expr; ?>. Utile in template.
-
<? short tag (sconsigliato).
-
/* ... */ commento multi-linea, // e # commento single-line.
Esempio di template semplice (separazione logica/presentazione):
Usare htmlspecialchars() per prevenire XSS quando si visualizza input utente.
3 — Modalità di esecuzione
-
Server web (Apache / Nginx + PHP-FPM / mod_php): file serviti via http://localhost.
-
Server integrato (dev): php -S localhost:8000 -t public/ per test rapido (non per produzione).
-
CLI: php script.php per strumenti a riga di comando. In CLI sono disponibili $argc, $argv.
Esempio CLI:
Dove rect_cli.php legge $argv[1] e $argv[2].
4 — Direttive utili per sviluppo
Nel file o in php.ini per sviluppo impostare:
In produzione disabilitare display_errors e loggare invece gli errori (error_log).
5 — Variabili: binding, naming e scope
Binding
In PHP le variabili iniziano con $ e fanno binding dinamico all’oggetto:
Regole di naming
-
Iniziano con $ seguito da lettera o underscore.
-
Sensibili a maiuscole/minuscole: $Var ≠ $var.
-
Evitare nomi di funzione o parole riservate.
Scope
-
Local (variabili dentro funzione), global (variabili file-scope), superglobals ($_GET, $_POST, $_SERVER, $_SESSION, $_COOKIE, $_FILES, $_ENV, $GLOBALS).
-
Per accedere a una variabile globale dentro una funzione usare $GLOBALS['name'] o global $name;.
-
static all’interno di una funzione mantiene valore tra invocazioni.
Esempi:
Variabili variabili (es. $a = 'b'; $$a = 5; → crea $b = 5) — utile ma spesso fonte di confusione e rischi; evitarle o usarle con cautela.
6 — Tipi di dato in PHP
Tipi scalari
-
int (integer), float (double), string, bool (boolean).
-
null rappresenta assenza di valore.
Tipi compound
-
array (vettori e mappe associative), object (istanze di classi), resource (risorse esterne: handle DB, stream).
Tipi speciali
Funzioni utili
-
gettype($x), var_dump($x), print_r($x), is_int(), is_float(), is_numeric(), is_string(), is_array(), is_null().
Esempio:
7 — Type juggling, casting e declare(strict_types=1)
PHP coerce automaticamente tipi quando necessario (type juggling), es.: '5' + 2 → 7. Questo può essere comodo ma anche fonte di bug.
Casting esplicito
Tipi stretti per funzioni (PHP 7+)
All’inizio del file:
Con strict_types attivo, la chiamata add('2','3') genera un TypeError; senza strict_types PHP tenterà coerzione.
Union types (PHP 8)
8 — Costanti: const vs define()
-
const NAME = value; — definizione a compile-time (dentro classi o global scope).
-
define('NAME', value); — definizione a runtime (case-sensitive per default).
Esempio:
Dal PHP 7 si possono usare const anche per array.
9 — Operatori
Aritmetici
+ - * / % ** (potenza **).
Assegnamento
=, +=, -=, *=, /=, .= (concatenazione assegnata).
Confronto
-
== (valore), === (valore + tipo), !=, !==, <, >, <=, >=.
-
Operator <=> (spaceship) restituisce -1, 0, 1 — utile per sort comparators (PHP 7+).
Logici
and, or, xor, &&, ||, !. Nota: and/or hanno precedenza inferiore rispetto ad = — preferire && e || in espressioni complesse.
Stringhe
Concatenazione: . operator. Interpolazione nelle stringhe doppie ("valore $v").
Null coalescing
$x = $_GET['p'] ?? 'default'; — ideale per recuperare valori con fallback.
Null coalescing assignment (PHP 7.4+)
$a ??= 'default';
Operator precedence
Attenzione alla precedenza: es. false && true vs false and true e =. Usa parentesi per chiarezza.
Esempi:
10 — Stringhe: literal, interpolation, heredoc, nowdoc
-
Doppie virgolette: interpreti variabili e sequenze (\n, \t).
-
Single quotes: letterale, migliore performance se non serve interpolation.
-
Heredoc: <<<EOT ... EOT; interpreta variabili.
-
Nowdoc: <<<'EOT' ... EOT; come single quote (no interpolation).
Esempi:
11 — Superglobals, input e sicurezza
Superglobals
-
$_GET, $_POST, $_REQUEST, $_COOKIE, $_FILES, $_SESSION, $_SERVER, $_ENV, $GLOBALS.
Input handling e validazione
Esempio:
Per stringhe e output HTML usare htmlspecialchars($str, ENT_QUOTES, 'UTF-8').
XSS e escaping
CSRF
12 — Buone pratiche e anti-pattern
Consigli
-
Abilitare declare(strict_types=1) nei file di produzione per maggior robustezza (valutare trade-off con interoperabilità).
-
Separare logica e view (template engine: Twig, Blade, ecc.).
-
Usare PDO + prepared statements per DB.
-
Validare e sanificare sempre input.
-
Usare Composer per gestione dipendenze e PSR-12 per coding standard.
Anti-pattern
-
Non usare eval() su input utente.
-
Evitare extract() su $_REQUEST.
-
Evitare @ operator per silenziare errori: nasconde problemi.
-
Non scrivere HTML con echo concatenati estensivamente — preferire template.
13 — Esercizio: script che calcola area e perimetro di un rettangolo
Presenteremo 4 versioni: (A) script semplice, (B) form web minimo, (C) form robusto con validazione e output sicuro, (D) CLI + test.
Versione A — Script PHP minimo (funziona in CLI o web con query string)
rect_simple.php
Chiamare: http://localhost/rect_simple.php?w=3.5&h=2.25
Limiti: nessuna validazione, output non escapato (ma numerico).
Versione B — Form web minimo (GET)
rect_form.php
Versione C — Form robusto con validazione e sicurezza
rect_robust.php
Punti chiave della versione C
-
declare(strict_types=1) impone controlli più rigorosi sulle tipologie quando usate type hints.
-
parseDecimal() gestisce la virgola come separatore decimale e blocca input non numerici.
-
htmlspecialchars() per evitare XSS.
-
number_format() per output leggibile con formattazione locale.
Versione D — CLI e test rapido
rect_cli.php
Test semplice (shell):
Output:
14 — Test, logging e error handling
Logging
Usare error_log() per registrare errori lato server o un logger PSR-3 (Monolog):
Unit testing
Per test automatici usare PHPUnit. Esempio di test (scheletro):
tests/RectTest.php
rect_functions.php con funzioni pure da testare:
Error handling
-
Usare eccezioni per casi critici.
-
Validare input e restituire messaggi utente chiari.
-
Non esporre informazioni di debug in produzione.
15 — Riepilogo best practice per il modulo
-
Validazione: ogni input va validato e sanitizzato (filter_input, filter_var).
-
Escaping: htmlspecialchars sempre per output HTML.
-
Typed code: preferire type hints e declare(strict_types=1) nei moduli critici.
-
Separa logica e presentazione: non mischiare troppo echo HTML/procedurale; usare template engine se il progetto cresce.
-
No eval, no extract($_REQUEST), no @ operator.
-
Usa PDO per accesso DB e prepared statements.
-
Gestione errori: log, testing e configurazione ambiente (dev vs prod).
Esempi addizionali e casi limite (quick reference)
-
'5' + '3' → 8 (coercizione numerica)
-
'05' == 5 → true, '05' === 5 → false
-
0 == 'abc' → true (attenzione!) — meglio is_numeric() prima di convertire.
-
?? and ?: differenza: $x = $a ?? 'd' vs $x = $a ?: 'd' (?: considera falsy).
16 — Materiale didattico consigliato e riferimenti
-
Manuale PHP (php.net) — pagine essenziali: Variables, Types, Type Declarations, filter_input, htmlspecialchars, PDO.
-
PSR-12 Coding Style Guide — standard di codice PHP.
-
OWASP PHP Security Cheat Sheet — buone pratiche di sicurezza web.
-
PHPUnit documentation — testing in PHP.
Conclusione e proposte operative (per il docente o il corsista)
-
Per la lezione di 3 ore:
-
30' teoria (sintassi, tags, error reporting),
-
45' variabili, tipi e operatori con esercizi rapidi (quiz su cui è vero/falso),
-
30' stringhe e formattazione,
-
45' laboratorio (implementare Versione B o C dell’esercizio rettangolo),
-
30' testing e riflessioni su sicurezza e best-practice.
-
Materiale da consegnare: zip con gli script (rect_simple.php, rect_form.php, rect_robust.php, rect_cli.php), rect_functions.php per unit tests, e README.md con istruzioni per eseguire in dev server (php -S localhost:8000).