1  Introduzione a PHP

1.1 Cos’è PHP e come funziona

1.1.1 Definizione e architettura client-server

PHP (PHP: Hypertext Preprocessor) è un linguaggio di scripting server-side progettato per lo sviluppo di applicazioni web dinamiche.

  • Non richiede una compilazione manuale prima dell’esecuzione: il motore PHP traduce internamente il sorgente in istruzioni intermedie (opcode) e le esegue sul server.
  • Client (browser): richiede una risorsa al server tramite una richiesta HTTP.
  • Server web (Apache/Nginx): elabora il file .php mediante l’interprete PHP.
  • Output: il server restituisce al client una risposta, spesso HTML, ma anche JSON, immagini, file o altri tipi di contenuto.

Il codice PHP viene utilizzato per generare dinamicamente i documenti HTML che il client riceve e visualizza nel browser.

NotaDa ricordare

Il browser del client riceve unicamente l’output generato dall’elaborazione; il codice sorgente PHP non viene mai mostrato direttamente all’utente.

1.1.2 Ciclo di vita di una richiesta HTTP

Il protocollo HTTP (HyperText Transfer Protocol) regola la comunicazione tra client e server web. Il funzionamento si basa sul modello richiesta/risposta: il client invia una richiesta e il server restituisce una risposta. Il server non contatta mai il client di propria iniziativa.

Browser (client)                        Server web (Apache) + PHP
     |                                            |
     |  ---- 1. Richiesta HTTP (GET/POST) ---->   |
     |                                            |  2. Esecuzione dello script PHP
     |  <---- 3. Risposta HTTP (HTML) --------    |
     |                                            |
     4. Il browser visualizza la pagina

Le fasi del ciclo di vita

  1. Richiesta dell’utente: l’utente digita un indirizzo (URL) nel browser, clicca su un link oppure invia un form.
  2. Risoluzione dell’indirizzo: il browser individua il server. In un sito reale il nome di dominio viene tradotto in un indirizzo IP dal servizio DNS; in locale si usa localhost (o 127.0.0.1), che indica il computer stesso.
  3. Connessione: il browser si collega al server sulla porta 80 (HTTP) oppure 443 (HTTPS, la versione cifrata del protocollo).
  4. Invio della richiesta HTTP: il browser invia al server il metodo (GET o POST), la risorsa richiesta, alcune informazioni aggiuntive (header) e, nel caso del metodo POST, i dati del form (body).
  5. Elaborazione lato server: il server web cerca la risorsa richiesta.
    • Se il file è statico (.html, .css, immagini), lo restituisce così com’è.
    • Se il file è .php, lo passa all’interprete PHP, che esegue il codice — eventualmente leggendo dati da un database o da altri file — e produce come risultato un documento HTML.
  6. Invio della risposta HTTP: il server restituisce al browser uno status code (l’esito della richiesta), gli header e il contenuto (body), generalmente HTML.
  7. Visualizzazione: il browser interpreta l’HTML e mostra la pagina. Se nella pagina sono presenti altre risorse (fogli di stile, immagini, script JavaScript), il browser effettua una nuova richiesta per ciascuna di esse.

Esempio di richiesta e risposta

Richiesta inviata dal browser (le righe successive alla prima sono gli header):

GET /sitoweb/index.php?nome=Mario HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0
Accept: text/html

Risposta restituita dal server:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8

<html>
    <body>
        <p>Ciao Mario</p>
    </body>
</html>

La prima riga della richiesta indica il metodo (GET), la risorsa richiesta (/sitoweb/index.php?nome=Mario) e la versione del protocollo. La prima riga della risposta contiene lo status code. Una riga vuota separa gli header dal body.

Gli status code principali

Lo status code è un numero di tre cifre; la prima cifra indica la categoria dell’esito:

  • 2xx (successo): 200 OK, la richiesta è stata eseguita correttamente;
  • 3xx (reindirizzamento): 301 e 302, la risorsa si trova a un altro indirizzo;
  • 4xx (errore del client): 403 Forbidden, accesso negato; 404 Not Found, risorsa inesistente;
  • 5xx (errore del server): 500 Internal Server Error, errore durante l’elaborazione, ad esempio nello script PHP.

PHP e pagine dinamiche

Poiché lo script PHP viene eseguito a ogni richiesta, la risposta può cambiare da una richiesta all’altra:

<?php
// orario.php
echo "<p>Sono le " . date("H:i:s") . "</p>";
?>

Il browser non riceve mai il codice PHP, ma solo il risultato, ad esempio <p>Sono le 10:30:15</p>. Ricaricando la pagina viene effettuata una nuova richiesta e l’orario mostrato sarà diverso.

NotaHTTP è stateless

HTTP è un protocollo stateless (senza memoria): ogni richiesta è indipendente dalle precedenti e il server non conserva alcuna informazione sul client. Questo spiega perché le variabili PHP vengono distrutte al termine dello script: per mantenere dati tra una richiesta e l’altra occorrono meccanismi specifici come cookie, sessioni e database.

ConsiglioOsservare le richieste

Per osservare le richieste e le risposte reali basta aprire gli strumenti per sviluppatori del browser (tasto F12) e selezionare la scheda Rete (Network): per ogni risorsa sono visibili metodo, status code, header e contenuto.

1.2 Stack tecnologico

  • Editor di codice: Visual Studio Code, Notepad++ o equivalenti.
  • XAMPP: ambiente di sviluppo che comprende Apache, MariaDB, PHP e altri strumenti.

Guida all’installazione e all’utilizzo di XAMPP

1.3 Sintassi base e output

1.3.1 Tag di apertura e istruzioni di output

I file da interpretare devono avere l’estensione .php, come ad esempio index.php. Ogni blocco di codice PHP deve essere delimitato dai tag <?php ... ?>. L’istruzione echo è utilizzata per inviare testo o markup HTML in output.

<?php

// Esempio 1: output di testo semplice e markup HTML
echo "<h1>Benvenuti al corso di PHP</h1>";
echo "<p>Primo script eseguito correttamente.</p>";

// Esempio 2: echo con argomenti multipli separati da virgola
echo "Docente: ", "Prof. Cerullo Pasquale", "<br>";

// Esempio 3: echo con variabili
$nome = "Pasquale";
echo "Ciao: " . $nome;
?>
ConsiglioFile contenenti solo PHP

Quando un file contiene esclusivamente codice PHP, è buona pratica omettere il tag finale ?>: si evitano così spazi o righe vuote inviati accidentalmente al browser.

1.3.2 Per iniziare

  • Avviare Apache dal pannello di controllo di XAMPP.
  • Salvare il file .php nella cartella C:\xampp\htdocs.
  • Aprire nel browser http://localhost/<nome_file>.php oppure http://127.0.0.1/<nome_file>.php.
NotaProgetti in sottocartelle

Se il progetto è suddiviso in sottocartelle, l’indirizzo segue il percorso del file. Per esempio, al file C:\xampp\htdocs\sitoweb\index.php corrisponde l’indirizzo http://127.0.0.1/sitoweb/index.php.

1.4 Variabili, tipi di dati e costanti

1.4.1 Gestione delle variabili e tipi primari

Le variabili in PHP sono precedute dal simbolo $. Il linguaggio supporta la tipizzazione dinamica: una variabile può contenere valori di tipi differenti durante l’esecuzione. Le variabili dichiarate fuori dalle funzioni appartengono all’ambito globale dello script; quelle dichiarate dentro una funzione sono normalmente locali. Tutte vengono eliminate al termine della richiesta.

<?php

// Variabili di tipi differenti
$nomeStudente = "Marco";  // string
$eta          = 20;       // int
$mediaVoti    = 28.5;     // float
$isIscritto   = true;     // bool: può contenere anche false

// Definizione di costanti
define("ANNO_ACCADEMICO", 2026);
const NOME_CORSO = "Programmazione Web Server-Side";

// Interpolazione di variabili, valida nelle stringhe con doppi apici
echo "Lo studente $nomeStudente (età: $eta) ha una media del $mediaVoti.<br>";

// Concatenazione tramite l'operatore punto (.)
echo "Corso: " . NOME_CORSO . " - Anno: " . ANNO_ACCADEMICO;
?>

1.4.2 Le stringhe

Una stringa è un insieme di caratteri. Le stringhe possono essere delimitate in due modi:

  • con apici singoli;
  • con virgolette doppie.
<?php
$frase = 'Anna disse: "Ciao!" ma nessuno rispose';
echo $frase;

$frase2 = "Anna disse: 'Ciao!' ma nessuno rispose";
echo $frase2;

echo 'Torniamo un\'altra volta'; // Torniamo un'altra volta
echo "Torniamo un'altra volta";  // Torniamo un'altra volta

// La riga seguente causerebbe un errore, perché l'apostrofo
// sarebbe interpretato come apice di chiusura:
// echo 'Torniamo un'altra volta';
?>
AvvisoNomenclatura e distinzione tra maiuscole e minuscole

I nomi delle variabili sono case-sensitive: $nome e $NOME indicano due variabili differenti.

1.4.3 Array

Un array (vettore) è una variabile complessa che contiene una serie di valori, ciascuno caratterizzato da una chiave o indice. Il seguente array contiene cinque valori:

$colori = array('bianco', 'nero', 'giallo', 'verde', 'rosso');
echo $colori[1]; // stampa 'nero'
echo $colori[4]; // stampa 'rosso'

Ogni colore è caratterizzato da un indice numerico, che PHP assegna automaticamente a partire da 0. È possibile accedere agli elementi dell’array tramite tale indice.

Esistono più modi per definire un array:

$colori = array('bianco', 'nero', 'giallo', 'verde', 'rosso');
$colori = ['bianco', 'nero', 'giallo', 'verde', 'rosso'];

$colori = array(1 => 'bianco', 'nero', 'giallo', 'verde', 'rosso');
// L'indice iniziale è 1.

$colori = array('primo' => 'bianco', 'secondo' => 'nero');
// Le chiavi sono stringhe associate ai valori.

In PHP la chiave di un array può essere un numero intero oppure una stringa. Gli array PHP possono quindi comportarsi sia come liste sia come mappe associative.

1.4.4 Array bidimensionali

Un array bidimensionale è un array che contiene altri array. Osserviamo un esempio:

$persone = array(
    array('nome' => 'Mario', 'cognome' => 'Rossi'),
    array('nome' => 'Paolo', 'cognome' => 'Bianchi'),
    array('nome' => 'Luca', 'cognome' => 'Verdi')
);

echo $persone[0]['cognome']; // stampa 'Rossi'
echo $persone[2]['nome'];    // stampa 'Luca'

$persone = [
    ['nome' => 'Mario', 'cognome' => 'Rossi'],
    ['nome' => 'Paolo', 'cognome' => 'Bianchi'],
    ['nome' => 'Luca', 'cognome' => 'Verdi']
]; // Sintassi equivalente all'esempio precedente.

1.4.5 Gli operatori

// Assegnazione
$nome = 'Giorgio';
$nome_app = $nome;

// Operatori aritmetici
$a = 3 + 7; // addizione
$b = 5 - 2; // sottrazione
$c = 9 * 6; // moltiplicazione
$d = 8 / 2; // divisione
$e = 7 % 4; // modulo

// Concatenazione delle stringhe
$nome = 'Pippo';
$stringa1 = 'Ciao ' . $nome;

// Operatori di assegnazione combinati
$x += 4; // equivale a $x = $x + 4
$x -= 3; // equivale a $x = $x - 3
$x .= $a; // equivale a $x = $x . $a
$x /= 5; // equivale a $x = $x / 5
$x *= 4; // equivale a $x = $x * 4
$x %= 2; // equivale a $x = $x % 2

// Incremento e decremento
$a++; // usa $a, poi lo incrementa di 1
$a--; // usa $a, poi lo decrementa di 1
++$a; // incrementa $a, poi lo usa
--$a; // decrementa $a, poi lo usa

Gli operatori di confronto producono sempre un valore booleano: true oppure false.

==  // valore uguale, anche se il tipo è diverso
!=  // valore diverso
>   // maggiore
>=  // maggiore o uguale
<   // minore
<=  // minore o uguale
=== // valore uguale e stesso tipo
!== // valore diverso oppure tipo diverso

Negli esempi moderni sono generalmente preferibili === e !==, perché confrontano sia il valore sia il tipo ed evitano conversioni implicite inattese.

Gli operatori logici consentono di combinare più espressioni:

  • OR è falso solamente se entrambi gli operandi sono falsi; si indica con or oppure ||.
  • AND è vero solamente se entrambi gli operandi sono veri; si indica con and oppure &&.
  • NOT è la negazione logica; si indica con !.
  • XOR, detto anche or esclusivo, è vero se uno solo dei due operandi è vero; si indica con xor.
AvvisoPrecedenza degli operatori logici

and e or non hanno la stessa precedenza di && e ||. Per rendere evidente l’ordine di valutazione, negli esempi e nelle condizioni è preferibile usare && e || e aggiungere parentesi quando si combinano più espressioni.

1.5 Esercizi

  1. Dato un numero, per esempio $numero = 35, stamparne il quadrato.
  2. Date base e altezza di un rettangolo, calcolare e stampare area e perimetro.
  3. Dati due numeri, stampare il resto della divisione e la media aritmetica.
  4. Convertire un numero di secondi in ore, minuti e secondi usando gli operatori / e %.
  5. Creare alcune variabili con tipi differenti e osservarne tipo e valore con var_dump().
AvvisoIstruzioni di consegna

Consegnare ogni esercizio in un file PHP diverso e numerato. Inserire tutti i file in una cartella denominata cognome_nome e consegnarla in formato compresso.