MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Tipizarea datelor

Spre deosebire de alte limbaje de programare, în PHP la definirea variabilelor sau a parametrilor funcțiilor nu este necesar să specificăm tipul de date. Cu toate acestea, PHP permite specificarea tipului de date pentru proprietățile claselor, parametrii funcțiilor și valorile returnate de funcții.

Specificarea tipului de date ajută la evitarea situațiilor în care se transmit date de tipuri neașteptate în program.

De exemplu:

function isPositive($number)
{
   return $number > 0;
}
$result = isPositive("-Youdontknowwhoiam");
if($result) echo "pozitiv";
else echo "negativ sau egal cu zero";

În acest caz, funcția isPositive() așteaptă evident un număr ca parametru pentru a stabili dacă este mai mare decât zero. Totuși, putem transmite o valoare arbitrară la apelarea funcției.

Pentru a evita astfel de situații, este necesar să specificăm explicit că funcția poate accepta doar numere, adică să tipizăm parametrul funcției.

Definirea tipului

Ce tipuri de date pot fi utilizate la tipizare:

  • bool: valorile permise sunt true și false
  • float: valoarea trebuie să fie un număr cu virgulă mobilă
  • int: valoarea trebuie să fie un număr întreg
  • string: valoarea trebuie să fie un șir de caractere
  • mixed: orice valoare
  • callable: valoarea trebuie să fie o funcție
  • array: valoarea trebuie să fie un tablou
  • iterable: valoarea trebuie să fie un tablou sau o clasă care implementează interfața Traversable (utilizat în bucla foreach)
  • Numele clasei: obiectul trebuie să reprezinte acea clasă sau o clasă derivată
  • Numele interfeței: obiectul trebuie să reprezinte o clasă care implementează acea interfață
  • self: obiectul trebuie să reprezinte aceeași clasă sau o clasă derivată. Poate fi utilizat doar în interiorul clasei
  • parent: obiectul trebuie să reprezinte clasa părinte a clasei respective. Poate fi utilizat doar în interiorul clasei

Tipizarea parametrilor funcției

La tipizarea parametrilor, tipul se specifică înaintea numelui parametrului:

function isPositive(int $number)
{
   return $number > 0;
}
$result1 = isPositive(25);                      // corect - 25 este un număr
$result2 = isPositive("25");                    // corect - PHP poate converti valoarea în număr
$result3 = isPositive("-Youdontknowwhoiam");    // Eroare TypeError

În acest caz, parametrul $number trebuie să fie de tip int, adică un număr întreg. Prin urmare, la apelarea funcției trebuie să transmitem o valoare întreagă.

Dacă se va transmite o valoare de alt tip, PHP va încerca să o convertească. În unele cazuri, această conversie poate avea succes:

$result2 = isPositive("25");

În alte cazuri, conversia poate eșua, iar programul se va opri cu o eroare TypeError:

$result3 = isPositive("-Youdontknowwhoiam");

Alt exemplu:

function sum(array $numbers, callable $condition)
{
   $result = 0;
   foreach($numbers as $number){
       if($condition($number))
       {
           $result += $number;
       }
   }
   return $result;
}

$isPositive = function($n){ return $n > 0;};

$myNumbers = [-2, -1, 0, 1, 2, 3, 4, 5];
$positiveSum = sum($myNumbers, $isPositive);
echo $positiveSum;  // 15

În acest caz, parametrii funcției trebuie să fie un tablou și o funcție (tip callable). Ca funcție, putem transmite o funcție anonimă.

Tipizarea valorii returnate

Pentru a stabili tipul valorii returnate de funcție, după lista parametrilor se specifică două puncte : urmate de tipul de date:

function isPositive(int $number) : bool
{
   return $number > 0;
}
$result = isPositive(34);

În acest caz, funcția isPositive trebuie să returneze o valoare de tip bool, adică true sau false.

Alt exemplu - returnarea unei funcții:

function select($n): callable{
   switch($n){
       case 1: return function($a, $b) {return $a + $b;};
       case 2: return function($a, $b) {return $a - $b;};
       case 3: return function($a, $b) {return $a * $b;};
       default: return function($a, $b) {return $a . " " . $b;};
   }
}
$selection = select(2);
echo $selection(4,5);   // -1

Este de menționat cuvântul cheie static, adăugat în PHP 8, care este utilizat pentru a returna din metoda clasei un obiect al aceleași clase:

class Node{
   
   function generate() : static{
       return new Node();
   }
}
$node1 = new Node();
$node2 = $node1->generate();

Tipizarea proprietăților

Ca tip pentru proprietăți poate fi utilizat orice tip în afară de callable:

class Person{
   
   public $name;
   public int $age;
}
$tom = new Person();
$tom->name = "Tom";
$tom->age = 36;      // valoare corectă
echo $tom->age;      // 36
$tom->age = "36";    // valoare corectă, deoarece PHP poate converti în număr
echo $tom->age;      // 36
$tom->age = "thirty-eight";  // valoare incorectă, apare eroarea TypeError
echo $tom->age;

În acest caz, este specificat explicit că proprietatea $age reprezintă tipul int, adică un număr întreg. Prin urmare, acestei proprietăți îi putem atribui doar valori întregi.

Trebuie menționat că o proprietate pentru care nu este specificat tipul de date are implicit valoarea null. În schimb, o proprietate pentru care este specificat tipul nu este inițializată, adică nu are o valoare specifică.

class Person{
   
   public $name;       // egal cu null
   public int $age;    // neinițializată
}

Astfel, dacă o proprietate netipizată o putem utiliza, încercarea de a accesa o proprietate tipizată dar neinițializată va duce la o eroare:

$tom = new Person();
echo $tom->name;     // ok - null
echo $tom->age;      // eroare - proprietatea nu este inițializată

Tipul union

În PHP 8 a fost adăugat tipul union sau de unire, care reprezintă unirea tipurilor, separate prin linia verticală |. De exemplu, dorim să scriem o funcție de adunare a numerelor și să permitem funcției să accepte doar numere.

Totuși, numerele în PHP sunt reprezentate prin două tipuri - int și float. Pentru a nu crea câte o funcție pentru fiecare tip, folosim unirea:

function sum(int|float $n1, int|float $n2): int|float
{
   return $n1 + $n2;
}
echo sum(4, 5);         // 9
echo "<br>";
echo sum(2.5, 3.7);     // 6.2

În acest caz, spunem că parametrii $n1 și $n2 pot reprezenta atât tipul int, cât și tipul float. În mod similar, valoarea returnată poate fi fie int, fie float.

← Lecția anterioară Lecția următoare →