Linguaggi a tipizzazione forte e debole

  • Guida PHP
  • Linguaggi a tipizzazione forte e debole

Linguaggi a tipizzazione forte e debole

I linguaggi a tipizzazione forte richiedono una specifica dichiarazione dei tipi di dati, altrimenti viene generato un errore se si tenta di effettuare operazioni su di essi in maniera non corretta.

D'altro canto i linguaggi a tipizzazione debole non richiedono una dichiarazione del tipo di variabile, piuttosto tentano una conversione del tipo a seconda delle operazioni che vengono eseguite sulle variabili.

Vediamo meglio con un esempio

<?php
$string = 'foo';
$integer = 0;

if ($string == $integer) {
    echo "I valori sono uguali";
} else {
    echo "I valori non sono uguali";
}

L'output di questo programma è I valori sono uguali, perché la condizione posta tra parentesi tonde viene valutata vera.

Ma perché PHP valuta vera l'uguaglianza tra due valori diversi tra loro?

Se vogliamo confrontare numeri con stringhe oppure stringhe numeriche tra di loro, in fase di esecuzione PHP effettua delle conversioni per poter effettuare un confronto di tipo numerico.

Nel nostro caso il tipo della variabile $string viene convertito da stringinteger. Dunque 'foo' è convertito a 0.

Alla fine la condizione tra parentesi diventa 0 == 0, che PHP interpreta ovviamente come vera.

Nota: se avessimo valorizzato $string con 'foo10', la conversione sarebbe stata uguale a 10 e PHP avrebbe valutato la condizione come falsa.

PHP quindi converte i tipi di dati solo in fase di esecuzione del codice, in base al contesto in cui i dati sono utilizzati.

Dunque comprendere al meglio il meccanismo di conversione dei tipi di dati in PHP è fondamentale per scrivere programmi corretti ed evitare risultati inattesi.

Nonostante questa caratteristica, il linguaggio mette a disposizione numerose funzioni per poter ricavare il tipo delle variabili. Ad esempio la funzione gettype() consente di verificare il tipo di dati in qualsiasi momento, come mostra il seguente esempio:

<?php
$string = "foo";
$integer = 0;

echo "$string è ".gettype($string).", $integer è ".gettype($integer); // foo è string, 0 è integer