# PHP

Questa pagina contiene il testo delle lezioni legate alla materia generale, per una più agevole lettura necessita di essere divisa in lezioni.
Per una lista completa delle materie da suddividere in lezioni, consulta la relativa categoria.

## Introduzione

Questa lezione presuppone conoscenze su principi generali della programmazione come il concetto di variabile, di metodo o funzione, cicli while o for, ecc.

### Cos'è PHP

PHP (acronimo ricorsivo di: PHP: Hypertext Preprocessor ovvero preprocessore di ipertesti) è un linguaggio di programmazione interpretato, concepito per generare pagine web dinamiche. L'interprete di PHP è un software libero rilasciato sotto la licenza PHP.
MediaWiki, la piattaforma su cui si basano molti progetti wiki fra i quali Wikipedia e Wikiversità, è un esempio di software scritto in PHP.
La sintassi del PHP è simile al C e al Perl.

### Dove testare PHP

Per utilizzare PHP al meglio è consigliabile un ambiente LAMP, ovvero composto dalle seguenti:
* Sistema operativo GNU/Linux
* Server web Apache
* Gestore di database MySQL
* PHP
Per installare una piattaforma di questo tipo si può seguire questa guida: PHP/Installazione (scegliere il capitolo corretto a seconda del sistema che si utilizza, come per esempio PHP/Installazione/Linux).

## Concetti di base
### Integrare PHP nelle pagine

Una pagina PHP solitamente ha estensione .php. Tutto ciò che sta in una pagina PHP è sempre mostrato in output, soltanto ciò che sta fra i tag di apertura <?php e ?> è prima interpretato dal motore PHP. Ciò è molto pratico per creare una completa pagina HTML e lanciare comandi PHP solo dove necessario. Esempio:
Ogni comando PHP termina con punto e virgola ;. Se il comando è l'ultimo, il punto e virgola può essere omesso (nell'esempio sopra può essere omesso). Anche il tag di chiusura ?> può essere omesso, se si trova alla fine del file. Di fatto, tale omissione è spesso preferibile, per evitare che siano accidentalmente presenti ulteriori caratteri indesiderati (come uno spazio).

### Commenti

Per rendere più leggibile il codice si usano i commenti. I commenti non vengono elaborati dall'interprete PHP. Vi sono 3 diversi stili di commenti:

### Stampare a video

Anteposto il concetto che ogni porzione di testo fuori dai tag <?php ?> viene mostrata a video, al contrario ogni porzione di codice all'interno dei tag <?php ?> non viene mostrata a video ma bensì interpretata. Vi sono per cui determinate istruzioni per mostrare a video un valore da PHP. Un esempio è l'istruzione echo:
Output: 6.

## Variabili

La gestione delle variabili in PHP è particolarmente "potente" rispetto a molti altri linguaggi di programmazione similari, in quanto una caratteristica del PHP è il non essere un linguaggio a tipizzazione forte.
Vantaggi tipici
* In PHP per instanziare una variabile è sufficiente assegnarle un valore;
* In PHP la dichiarazione del tipo di variabile è implicita durante l'assegnazione di un valore;
* In PHP una variabile può essere rimossa anche nel corso dello script (tramite l'istruzione unset($variabile));
* In PHP il tipo di una variabile può variare nel corso dello script;
Caratteristiche tecniche
* In PHP le variabili sono sempre precedute dal simbolo del dollaro (esempio: $variabile);
* In PHP le variabili sono case sensitive (c'è differenza tra la variabile $wiki e $WIKI);
Esempio
Output: 20W Wikiversità2.3
È divertente notare che è stata usata la stessa variabile per contenere uno dopo l'altro ben tre tipi diversi di variabile.
Funzioni di controllo utili
* isset($variabile) Per controllare se una variabile esiste;
* empty($variabile) Per controllare se una variabile è considerata vuota (ovvero se la variabile non esiste o se assume valori di default come false, 0, stringa vuota (''), null ecc.);
Funzioni utili per il debug
* var_dump($variabile) Mostra a video tutte le informazioni reperibili da una variabile;
* print_r($variabile) Simile a debug, dà un risultato più leggibile "agli umani";

### Dinamicità

Peculiarità da ignorare nell'uso comune di PHP, ma che dà l'idea della sua dinamicità, è la possibilità di richiamare una variabile attraverso il suo nome in formato di stringa. Per fare ciò si utilizza il costrutto ${'nome_variabile'}. Questo concetto si chiama variabili variabili. Esempio:
Output: A video vedrò solo questa frase.
Per capire meglio l'esempio ipotizziamo di essere l'interprete di PHP e osservare l'ultima riga, eseguendo una pseudo elaborazione passo-passo:
* echo ${$nomevariabile}
* echo ${'frase'} (Questo perché $nomevariabile contiene la stringa 'frase')
* echo $frase
* Output: A video vedrò solo questa frase
Questo argomento si può approfondire notevolmente sul manuale ufficiale.

### Stringhe

Una stringa, ovvero un insieme di caratteri, si istanzia in due modi abbastanza interscambiabili: con apici doppi ("Hello, World!") o singoli ('Hello, World!'). Quindi, a differenza del linguaggio C, la variabile $a = 'A' non è di tipo 'char', ma semplicemente una stringa di lunghezza 1.
Con gli apici singoli si ottiene una stringa "così com'è". Gli apici doppi sono utili per interpretare al loro interno altre variabili o particolari caratteri di stampa (per esempio nomi di variabili inizianti con il dollaro ($) oppure caratteri speciali come la tabulazione \t).
L'operazione tipica delle stringhe è la concatenazione, è ciò tipicamente si esegue con il punto (.).
Esempio di composizione della frase "Wikipedia è meravigliosa" in due modi: concatenandola con apici singoli e doppi:
Output: Wikipedia è meravigliosa.
Altro esempio:
Output: Wikipedia è meravigliosa.

### Array

Questo argomento tratta di variabili multidimensione. Se non hai esperienza con altri linguaggi di programmazione ti consigliamo di leggere prima gli operatori e le strutture di controllo.
PHP gestisce gli array come delle mappe associative, ovvero come un elenco di chiave => valore. Gli array in PHP possono perciò essere usati sia come un comune array ma anche come una lista (vettore), una stack, una coda, e molto altro. Inoltre un qualsiasi elemento dell'array può a sua volta contenere altri array multidimensionali e tutti gli elementi dell'array o dei sotto-array possono essere di tipo diverso, lasciando così la possibilità di creare strutture dati molto complesse (ricordando che però ci sono le classi, per questo genere di strutture). Ciò fa degli array una vera peculiarità del PHP.
Esempio di un array:
L'output di print_r evidenzia bene la mappa chiave => valore che si viene a creare:
Il costrutto foreach serve per attraversare un array quando non è possibile farlo con altri mezzi, dato che la numerazione degli indici ("chiavi") non sono sempre numeriche, ordinate e continue.
Esempio:
Output:
Gli utilizzi degli array e di tutte le relative funzioni e costrutti (compreso il foreach) sono argomenti da approfondire sul manuale ufficiale o sulla sezione dedicata (da ampliare): /Array.

#### Array predefiniti

È opportuno sapere che vi sono una serie di array predefiniti da PHP è che non bisognerebbe mai sovrascrivere.
Alcuni fra i più utilizzati:
* $_SERVER - Informazioni sull'ambiente di sviluppo e sul server
* $_GET - Array associativo di parametri HTTP GET
* $_POST - Array associativo di parametri HTTP POST
* $_FILES - Array associativo di file caricati in upload
* $_SESSION - Array associativo di variabili di sessione
* $_COOKIE - Array associativo dei cookie

### Costanti

Una costante è un contenitore (come le variabili) di un dato semplice e non può essere ri-assegnata.Sono sempre di visibilità globale e per convenzione si scrivono in maiuscolo. Per l'accesso non si usa il $. Una costante si dichiara tramite il costrutto define:
Output: valore.
Una costante di classe si dichiara tramite const:
Output: 34.
È bene sapere che le costanti di classe sono sempre implicitamente dichiarate come statiche (static).
Esempio di utilizzo di costanti e variabili:
Output: Il prodotto è: 272.

#### Costanti magiche

In PHP esistono costanti predefinite (nota: non è possibile dichiarare costanti con lo stesso nome se esistono già), alcune delle quali si chiamano costanti magiche poiché nella teoria sono vere e proprie costanti (poiché non possiamo assegnar loro alcun valore) ma in realtà il loro valore può variare "da solo" nel corso dello script per cause esterne, appunto, quasi magicamente:
Costanti magiche più note:
* __LINE__ Contiene il numero di riga dove la costante è richiamata, ad ogni riga la costante varia
* __FILE__ Contiene il nome del file dove si sta eseguendo il codice PHP attualmente (ad ogni inclusione la costante cambia)
* __DIR__ Contiene il nome della cartella dove si sta eseguendo il file in PHP
* __FUNCTION__ Richiamata dentro ad una funzione, questa costante contiene il nome della funzione stessa
* __CLASS__ Richiamata dentro ad una classe, questa costante contiene il nome della classe stessa

## Operatori
### Operatori matematici

Gli operatori matematici utilizzabili sono:

#### $a + $b

    Addizione

#### $a - $b

    Sottrazione

#### $a * $b

    Moltiplicazione

#### $a / $b

    Divisione

#### $a % $b

    Modulo (resto)
Un esempio:
Output: 2.
(Il resto della divisione fra 5 e 3, è infatti 2.)

### Operatori di confronto

Gli operatori di confronto tra variabili sono:

#### $a == $b

    Se contengono gli stessi dati (per esempio il numero 5 e la stringa "5" sarebbero uguali). Vedi le note importanti.

#### $a === $b

    Identici: se contengono gli stessi dati e sono dello stesso tipo.

#### $a != $b

    Se $a è diverso da $b.

#### $a <> $b

    Se $a è diverso da $b.

#### $a !== $b

    Non identici: se $a è diverso da $b o se essi non sono dello stesso tipo.

#### $a < $b

    Se $a è minore di $b.

#### $a > $b

    Se $a è maggiore di $b.

#### $a <= $b

    Se $a è minore o uguale di $b.

#### $a >= $b

    Se $a è maggiore o uguale di $b.
È però importante sottolineare una nota spiacevole riguardante l'operatore di confronto ==, tramite questo esempio:

### Note importanti sull'operatore " == "

Ci sono molte stringhe il cui valore, per diverse versioni di PHP, è identico anche se sono visivamente differenti. Per questo, se si ha a che fare con due interi, con due stringhe, o con due variabili dello stesso tipo, sarebbe sempre meglio usare === per evitare di essere vittima di risultati imprevedibili dovuti a male-conversioni da parte di PHP dovute all'utilizzo di ==.
Esempio:

## Strutture di controllo
### if

Output: Il numero 5 è diverso da 4.

### if else

Output: Il numero 5 è diverso da 4.

### if annidati

Output: Il numero 5 è dispari

### switch

Output: Un due tre, è brutto far da sè.
Se nessun case è verificato entra in azione il default (se usato).
È importante inserire un break al termine di ogni case se si vuole che venga eseguito soltanto il codice all'interno del primo case verificato.

### Operatore ternario

L'operatore ternario è un particolare costrutto if-else molto potente che segue questa sintassi:
Esempio:
Output: Benvenuto nel nuovo millennio.

## Funzioni

Le funzioni in PHP possono avere un mix di parametri opzionali con valori predefiniti o parametri obbligatori (per questo motivo il concetto di overloading in PHP è perfettamente inutile).
Esempio di funzione con un parametro obbligatorio e uno opzionale:
Qualunque variabile di qualunque tipo creata dentro alla funzione diventa locale.
Per specificare variabili globali dentro alla funzione si usa global $variabile. Esempio:
Il risultato sarà: Prima uno due Durante tre quattro Dopo tre due.

### Funzioni anonime

È possibile utilizzare funzioni anonime da PHP 5.3:
Esempio utilizzando array_map, che richiede come primo parametro una funzione callback::
Output: 1 ... 4 ... 9 ... 16 ... 25

## Cicli
### for

Sintassi:
Altro esempio:
Output:

### foreach

Il ciclo foreach cicla dall'inizio alla fine la mappa chiave => valore di un array.
Esempio:
Output:
O se non mi interessano le chiavi:
Output: la volpe marrone - e veloce - saltò sopra - al cane stanco -.

### while

Esegue il codice al suo interno fintanto che una condizione viene soddisfatta:
Output: 123456789.
Nota che in certi casi il ciclo potrebbe non essere eseguito nemmeno una volta.

### do while

Simile al while, ma in questo caso si è sicuri di eseguire il ciclo almeno la prima volta:
Output: Ecco il ciclo... e sono positivo e sono positivo .

## Variabili globali
### GET

Una delle variabili globali di PHP è $_GET['nome'] e restituisce il valore di una variabile passata attraverso una classica richiesta HTTP GET.
Supponiamo di avere una pagina chiamata index.php e di caricarla tramite alcuni parametri HTTP GET:
A questa pagina passiamo due variabili: esempio, con valore uguale a "67", e pippo, con valore uguale a "163". Per far utilizzare questi dati il codice di index.php sarà più o meno questo:
Output: La somma è: 230.

### POST

Un'altra delle variabili globali di PHP è $_POST['nome'] e restituisce il valore di una variabile passata attraverso il metodo HTTP POST (da un form di login ad esempio).
Per inviare dei dati attraverso POST il codice sarà simile a questo:

### Cookie

Un cookie è una porzione di stringa che, dal sito, è possibile richiedere di far memorizzare sul browser. Se il browser ha i cookie abilitati, accetterà il cookie e lo ri-spedirà alla pagina ad ogni prossima richiesta (fino allo scadere di un certo timeout, dopo il quale il cookie sarà eliminato).
Ma vediamo subito come settare ed eliminare i cookies. Prima di tutto c'è da ricordarsi che i cookies fanno parte degli header http e che quindi devono essere inviati prima di qualsiasi output html. Questa è in dettaglio la funzione per settare i cookies in PHP:
Il terzo parametro indica il tempo di scadenza in secondi.
La cancellazione di cookie avviene in modo identico, invalidando il tempo di scadenza:
Questa funzione cancella un cookie immediatamente visto che il suo tempo di scadenza è impostato ad un'ora fa.
Una volta impostati dei cookie con dei valori, questi ultimi possono essere richiamati in modo analogo a GET e POST in qualsiasi pagina attraverso $_COOKIE['nomecookie'].

### Sessioni

La sessione è un modo per evitare di toccare i cookie a mano. All'utente viene assegnato un identificatore di sessione che permette a PHP di sapere a quale sessione appartiene. I valori di una sessione sono scritti su file, e dopo un certo periodo di tempo di inattività sono cancellati.
Esempio in pagina-1.php:
Esempio in pagina-2.php:
Output se ho visitato la pagina-1.php e in seguito la pagina-2.php: Ciao Mario!.
Se vogliamo eliminare la sessione si può usare session_destroy.

## Database
### MySQLi

PHP si interfaccia facilmente a molti tipi di database. Il più famoso è sicuramente MySQL o il suo fork MariaDB.
Esempio: