Il linguaggio PHP

Il linguaggio PHP

  • Variabili, operatori ed espressioni
  • Selezione e iterazione
  • Funzioni
  • Date e orari

Variabili, operatori ed espressioni

Tipizzazione dinamica

  • In PHP ogni variabile inizia con il simbolo $
  • Il tipo di dato non si dichiara: viene stabilito in fase di esecuzione in base al valore assegnato
  • Una variabile può cambiare tipo durante l'esecuzione

Principali tipi di dato

Tipo Descrizione Esempio
integer numeri interi 10
float (double) numeri con parte decimale 1.5
string sequenze di caratteri tra apici singoli o doppi "ciao", 'ciao'
boolean vero o falso true, false
array variabili che contengono più valori array(1, 2, 3)

Sono considerati falsi: 0, NULL, la stringa vuota e un array privo di valori.

Esempio: tipi e conversioni

<?php
$a = 10;           // integer
$b = $a + 1.5;     // float: 11.5
$c = "5 pippo";    // string
$d = $c + 7;       // integer: prende il "5" iniziale e somma 7 → 12

print "integer  a=$a <br>";
print "real     b=$b <br>";
print "string   c=$c <br>";
print "integer  d=$d <br>";

$m = 10.8;          // float
$n = (integer)$m;   // cast esplicito a integer → 10
print "real     m=$m <br>";
print "integer  n=$n";
?>

Attenzione alle conversioni implicite

  • "5 pippo" + 7 vale 12, ma PHP 8 segnala un warning (stringa numerica solo in parte)
  • "pippo 5" + 7: la stringa non inizia con un numero
    • PHP 7: vale 7 (la stringa è convertita in 0)
    • PHP 8: errore TypeError
  • Il cast esplicito (integer) / (int) tronca la parte decimale: (int)10.8 vale 10

Operatori aritmetici

<?php
$a = 21;
$b = 11;
echo "a=$a b=$b <br>";
echo "Somma: "           . ($a + $b) . "<br>";   // 32
echo "Sottrazione: "     . ($a - $b) . "<br>";   // 10
echo "Prodotto: "        . ($a * $b) . "<br>";   // 231
echo "Divisione: "       . ($a / $b) . "<br>";   // 1.9090909090909
echo "Resto divisione: " . ($a % $b) . "<br>";   // 10
?>

La divisione / restituisce un float se il risultato non è intero; il numero di decimali mostrati dipende dal parametro precision di php.ini.

Operatori di incremento e assegnamento

Hanno una sintassi analoga a quanto visto nel linguaggio C

<?php
$c = 10;
$c++;      // 11
$c--;      // 10
$c += 7;   // 17
$c -= 7;   // 10
$c *= 7;   // 70
$c /= 7;   // 10
echo "c=$c <br>";
?>

Concatenazione di stringhe

  • L'operatore di concatenazione è il punto .
  • .= accoda una stringa a una variabile
  • Il + non concatena: tenta una somma numerica
<?php
$a = "Ciao ";
$b = $a . "Mondo!";   // $b contiene "Ciao Mondo!"
print("$b <br>");

$a = "Ciao ";
$a .= "Mondo!";       // $a contiene "Ciao Mondo!"
print("$a <br>");

$a = 2;
$c = $a + "3";        // 5: la stringa numerica viene convertita
print("$c <br>");
?>

Apici doppi, apici singoli e caratteri speciali

  • Tra apici doppi le variabili vengono sostituite con il loro valore (interpolazione)
  • Tra apici singoli il testo è preso alla lettera
  • Il carattere \ (escape) permette di inserire caratteri speciali
<?php
$nome = "Anna";
print "Ciao $nome <br>";           // Ciao Anna
print 'Ciao $nome <br>';           // Ciao $nome

$CarSpec = "My \"so called\" life.";
print("$CarSpec <br>");            // My "so called" life.
?>

Selezione

Selezione unaria e binaria: if / else

<?php
// selezione unaria
$a = 5;
$b = 5;
if ($a == $b)
{
    print "I valori sono uguali <br>";
    print "a=$a, b=$b <br>";
}

// selezione binaria
$a = 5;
$b = 6;
if ($a == $b)
{
    print "I valori sono uguali <br>";
}
else
{
    print "I valori sono diversi <br>";
}
?>

Selezione nidificata ed elseif

<?php
$a = 7;
$b = 6;

// selezione nidificata
if ($a < $b)
    print "$a e' minore di $b <br>";
else
{
    if ($a > $b)
        print "$a e' maggiore di $b <br>";
    else
        print "$a e' uguale a $b <br>";
}

// stessa logica con il costrutto elseif
if ($a < $b)      { print "$a e' minore di $b <br>"; }
elseif ($a > $b)  { print "$a e' maggiore di $b <br>"; }
else              { print "$a e' uguale a $b <br>"; }
?>

Operatori logici

  • && (AND): vero se entrambe le condizioni sono vere
  • || (OR): vero se almeno una condizione è vera
  • ! (NOT): vero se la condizione è falsa
<?php
$someValue  = 24;
$otherValue = 23;

if ($someValue > 20 && $otherValue > 20)
    print("Primo caso <br>");      // stampato

if ($someValue == 24 || $otherValue == 24)
    print("Secondo caso <br>");    // stampato
?>

Selezione multipla: switch

<?php
$colore = "red";
switch ($colore)
{
    case "red":
        echo "Your favorite color is red!";
        break;
    case "blue":
        echo "Your favorite color is blue!";
        break;
    case "green":
        echo "Your favorite color is green!";
        break;
    default:
        echo "Your favorite color is neither red, blue, nor green!";
}
?>
  • switch funziona sia con numeri sia con stringhe
  • break interrompe lo switch: senza di esso l'esecuzione prosegue nel case successivo
  • default viene eseguito se nessun case corrisponde

Iterazione

Ciclo for

Ciclo con numero di iterazioni noto a priori:

<?php
$NR_CICLI = 4;
for ($a = 1; $a <= $NR_CICLI; $a++)
{
    $b = $a * 2;
    print "($a * 2) = $b <br>";
}
?>
(1 * 2) = 2
(2 * 2) = 4
(3 * 2) = 6
(4 * 2) = 8

Cicli while e do ... while

<?php
$NR_CICLI = 4;

// ciclo a condizione iniziale: può non essere eseguito mai
$a = 1;
while ($a <= $NR_CICLI)
{
    $b = $a * 2;
    print "($a * 2) = $b <br>";
    $a++;
}

// ciclo a condizione finale: eseguito almeno una volta
$a = 1;
do
{
    $b = $a * 2;
    print "($a * 2) = $b <br>";
    $a++;
} while ($a <= $NR_CICLI);
?>

Definizione di funzioni

  • Si definiscono con la parola chiave function
  • return restituisce il valore al chiamante
  • Non si indica il tipo dei parametri né del valore di ritorno (è però possibile farlo nelle versioni recenti di PHP)
<?php
// senza parametri
function somma_no_parametri()
{
    $a = 5;
    $b = 7;
    return ($a + $b);
}

// con parametri passati per valore
function somma_parametri($c, $d)
{
    return ($c + $d);
}
?>

Passaggio per valore e per riferimento

  • Per valore (default): la funzione riceve una copia; le modifiche non si riflettono sul chiamante
  • Per riferimento (&): la funzione lavora sulla variabile originale
<?php
function scambia(&$c, &$d)
{
    $e = $c;
    $c = $d;
    $d = $e;
}

$a = 5;
$b = 7;
scambia($a, $b);
print "a=$a  b=$b";     // a=7  b=5
?>

Utilizzo delle funzioni

<?php
$somma = somma_no_parametri();
print "Somma senza parametri: $somma <br>";          // 12

$a = 5;
$b = 7;
$somma = somma_parametri($a, $b);
print "Somma $a e $b con parametri: $somma <br>";    // 12
?>

Funzioni matematiche predefinite

Funzione Descrizione Esempio
rand($min, $max) intero casuale compreso tra due valori rand(10, 20)
abs($x) valore assoluto abs(-3.4) → 3.4
pow($b, $e) elevamento a potenza pow(2, 4) → 16
sqrt($x) radice quadrata sqrt(9) → 3
round($x) arrotonda all'intero più vicino round(2.5) → 3

round: decimali da 0 a 4 → intero precedente; da 5 a 9 → intero successivo (round(2.3) → 2).

Data e ora

La funzione date

date(formato) restituisce data e ora di sistema secondo il formato indicato:

Parametro Significato
H ora nel formato 24 ore (00-23)
i minuti (00-59)
s secondi (00-59)
w giorno della settimana (0 = domenica, 6 = sabato)
d giorno del mese (01-31)
m mese (01-12)
y / Y anno a due / quattro cifre

Esempio: data odierna in italiano

<?php
$ora     = date("H");
$minuti  = date("i");
$secondi = date("s");
$nr_giorno_settimana = date("w");
$nr_mese         = date("m");
$giorno_del_mese = date("d");
$anno            = date("Y");

switch ($nr_giorno_settimana)
{
    case 0: $giorno_settimana = "domenica";  break;
    case 1: $giorno_settimana = "lunedi'";   break;
    // ... casi da 2 a 5 ...
    case 6: $giorno_settimana = "sabato";
}

switch ($nr_mese)
{
    case 1:  $mese = "Gennaio";  break;
    // ... casi da 2 a 11 ...
    case 12: $mese = "Dicembre";
}

print "Data odierna: $giorno_del_mese $mese $anno <br>";
print "Giorno della settimana: $giorno_settimana <br>";
print "Ora: $ora:$minuti:$secondi";
?>

Il timestamp

  • Il timestamp è il numero di secondi trascorsi dal 1 gennaio 1970 alle 00:00 (Unix epoch)
  • mktime(ora, minuti, secondi, mese, giorno, anno) restituisce il timestamp di una data
  • Trasformare le date in numeri permette di confrontarle e di calcolarne la differenza

Confronto tra date

<?php
$giorno_1 = 12;  $mese_1 = 1;  $anno_1 = 2018;
$giorno_2 = 10;  $mese_2 = 3;  $anno_2 = 2018;

$timestamp_1 = mktime(0, 0, 0, $mese_1, $giorno_1, $anno_1);
$timestamp_2 = mktime(0, 0, 0, $mese_2, $giorno_2, $anno_2);

print "Data 1: $giorno_1/$mese_1/$anno_1 <br>";
print "Data 2: $giorno_2/$mese_2/$anno_2 <br>";

if ($timestamp_1 > $timestamp_2)
    print "La data 1 e' quella piu' recente";
elseif ($timestamp_1 < $timestamp_2)
    print "La data 2 e' quella piu' recente";
else
    print "Le due date coincidono";
?>

Differenza in giorni tra due date

<?php
$giorno_1 = 1;   $mese_1 = 1;  $anno_1 = 2018;
$giorno_2 = 12;  $mese_2 = 1;  $anno_2 = 2018;

$timestamp_1 = mktime(0, 0, 0, $mese_1, $giorno_1, $anno_1);
$timestamp_2 = mktime(0, 0, 0, $mese_2, $giorno_2, $anno_2);

$secondi_in_un_giorno = 60 * 60 * 24;     // 86400
$giorni_trascorsi = ($timestamp_2 - $timestamp_1) / $secondi_in_un_giorno;

print "Giorni trascorsi: $giorni_trascorsi";   // 11
?>

Sintassi essenziale

Concetto Sintassi PHP
Variabile $nome = valore;
Cast (int)$x, (float)$x, (string)$x
Concatenazione $a . $b, $a . $b=
Selezione if (...) { } elseif (...) { } else { }
Selezione multipla switch ($x) { case ...: break; default: }
Concetto Sintassi PHP
Cicli for, while, do ... while, foreach
Array numerico $a = [1, 2, 3]; $a[] = 4;
Array associativo $a = ["k" => "v"];
Scansione associativo foreach ($a as $k => $v)
Funzione function nome($p) { return ...; }
Parametro per riferimento function f(&$p) { ... }

Fine

Documentazione ufficiale: https://www.php.net/manual/it/