Sobes.tech
Junior

Ako funguje dynamické typovanie v PHP?

sobes.tech AI

Odpoveď od AI

PHP je jazyk s dynamickým a slabým typovaním.

  • Dynamické typovanie: Typ premennej je určený počas behu na základe priradenej hodnoty a nie je deklarovaný explicitne vopred.
  • Slabé typovanie: PHP môže vykonávať nepriame konverzie typov (kontextovú konverziu), čo môže niekedy viesť k nečakanému správaniu pri porovnávaní alebo operáciách medzi hodnotami rôznych typov.

Príklady:

  1. Zmena typu premennej:
    <?php
    $variable = 123;    // int
    $variable = "ahoj"; // string
    $variable = [1, 2]; // pole
    ?>
    
  2. Nepriama konverzia typov pri porovnávaní:
    <?php
    var_dump(10 == "10"); // bool(true) - reťazec "10" sa konvertuje na číslo 10
    var_dump(0 == false); // bool(true) - false sa konvertuje na číslo 0
    var_dump("abc" == 0); // bool(true) - reťazec "abc" sa konvertuje na číslo 0, pretože nezačína číslom
    ?>
    
  3. Použitie prísneho porovnania na zabránenie nepriamej konverzie:
    <?php
    var_dump(10 === "10"); // bool(false) - porovnáva sa ako hodnota, tak aj typ
    var_dump(0 === false); // bool(false)
    var_dump("abc" === 0); // bool(false)
    ?>
    

Hoci dynamické typovanie poskytuje flexibilitu a zrýchľuje vývoj v počiatočných fázach, môže viesť k chybám, ktoré sú odhalené iba počas behu. Na zvýšenie spoľahlivosti kódu boli v PHP 7+ zavedené deklarácie typov (type declarations) a prísny režim typov (strict types).

<?php
declare(strict_types=1); // Aktivuje prísny režim typov pre aktuálny súbor

function sum(int $a, int $b): int { // Deklarácia typov argumentov a návratovej hodnoty
    return $a + $b;
}

// sum(1, "2"); // Toto spôsobí chybu typu (TypeError) v prísnom režime

?>

Deklarácie typov a prísny režim umožňujú vykonávať kontroly typov počas statickej analýzy alebo počas behu pred volaním funkcie, čo prispieva k písaniu predvídateľnejšieho a ľahšie udržiavateľného kódu.