Typy danych i declare(strict_types=1)

🎯 Po tej lekcji rozpoznasz typy danych w PHP i będziesz dodawać declare(strict_types=1) do każdego nowego pliku.

Kiedy Ola wpisuje swoje imię w formularzu, PHP dostaje tekst. Kiedy podaje wiek — liczbę. Kiedy zaznacza checkbox „chcę newsletter" — wartość tak/nie. PHP musi wiedzieć, z jakim rodzajem danych pracuje — i tu właśnie wchodzą typy.

Typy skalarne w PHP

PHP ma cztery podstawowe (skalarne) typy danych:

| Typ | Co przechowuje | Przykład | |-----|---------------|---------| | string | Tekst | 'Ola', "Kraków" | | int | Liczba całkowita | 25, -10, 0 | | float | Liczba z częścią ułamkową | 3.14, 19.99 | | bool | Wartość logiczna: tak lub nie | true, false |

Jest też specjalny typ null, który oznacza „brak wartości":

<?php
declare(strict_types=1);

$imie    = 'Ola';    // string
$wiek    = 25;       // int
$cena    = 19.99;    // float
$aktywny = true;     // bool
$uwagi   = null;     // null — brak uwag

var_dump($imie);    // wynik: string(3) "Ola"
var_dump($wiek);    // wynik: int(25)
var_dump($cena);    // wynik: float(19.99)
var_dump($aktywny); // wynik: bool(true)
var_dump($uwagi);   // wynik: NULL

var_dump pokazuje typ i wartość jednocześnie — dlatego jest tak przydatny w nauce.

Skąd PHP wie, jaki typ?

W PHP nie musisz pisać „to jest int, a to string" — PHP sam rozpoznaje typ na podstawie wartości:

  • 'Ola' w cudzysłowie → string
  • 25 bez cudzysłowia → int
  • 3.14 z kropką → float
  • true lub false → bool

To wygodne, ale może prowadzić do niespodzianek, gdy PHP zaczyna sam konwertować typy. Tu z pomocą przychodzi declare(strict_types=1).

declare(strict_types=1) — dlaczego to ważne?

Bez tej deklaracji PHP chętnie „pomaga" konwertując typy za Ciebie:

<?php
// BEZ strict_types — PHP konwertuje po cichu

function podwoj(int $n): int {
    return $n * 2;
}

echo podwoj('5');   // PHP konwertuje '5' na 5 — cicho, bez ostrzeżenia!

Na pierwszy rzut oka to wygląda wygodnie. Ale takie automatyczne konwersje mogą ukrywać błędy przez długi czas — i sprawią, że zamiast wyraźnego błędu program cicho przyjmie stringa i zwróci 10.

Z declare(strict_types=1) PHP zamiast konwertować — zgłosi błąd:

<?php
declare(strict_types=1);

function podwoj(int $n): int {
    return $n * 2;
}

echo podwoj(5);     // wynik: 10 — OK
echo podwoj('5');   // TypeError: podwoj(): Argument #1 must be of type int, string given
💡 Dobry nawyk: Zawsze stawiaj declare(strict_types=1); w pierwszej linii po <?php. Możesz nawet zrobić z tego swój osobisty szablon nowego pliku. Zapobiegasz w ten sposób całej klasie trudnych do znalezienia błędów.

Deklaracja musi być pierwsza

declare(strict_types=1) działa tylko wtedy, gdy stoi na samym początku pliku jako pierwsza instrukcja — przed jakimkolwiek innym kodem czy wyjściem (puste linie i tag <?php jej nie przeszkadzają):

<?php
declare(strict_types=1);   // ← MUSI być tu, zaraz po <?php

// Teraz możesz pisać resztę kodu
$imie = 'Kuba';
echo $imie; // wynik: Kuba
⚠️ Uwaga: Jeśli umieścisz declare(strict_types=1) gdziekolwiek indziej — w środku pliku lub po pierwszej instrukcji — PHP albo zgłosi błąd, albo je zignoruje. Zawsze na początku!

Przegląd na jednym ekranie

<?php
declare(strict_types=1);

// Cztery typy skalarne + null
$nazwa     = 'Sklep Kubusia';  // string
$liczbaIzb = 3;                // int
$temperatura = -2.5;           // float
$czyOtwarty  = true;           // bool
$notatka     = null;           // null — brak wartości

var_dump($nazwa);        // string(13) "Sklep Kubusia"
var_dump($liczbaIzb);    // int(3)
var_dump($temperatura);  // float(-2.5)
var_dump($czyOtwarty);   // bool(true)
var_dump($notatka);      // NULL

W kolejnych lekcjach zobaczysz, jak te typy współpracują z funkcjami i jak PHP pomaga Ci w pisaniu bezpieczniejszego kodu.

Sprawdź się

Jaki typ danych ma wartość true?

Co oznacza declare(strict_types=1) na początku pliku?

Jaki typ ma wartość 3.14?

Który z poniższych przykładów ma typ null?

Ćwiczenie

Utwórz plik z declare(strict_types=1) i zadeklaruj po jednej zmiennej każdego typu: string, int, float, bool i null. Do każdej zmiennej dodaj komentarz z jej typem. Na końcu wyświetl je wszystkie przez var_dump.

Pokaż rozwiązanie
<?php
declare(strict_types=1);

$imie      = 'Ola';   // string
$wiek      = 25;     // int
$wzrost    = 1.68;   // float
$aktywny   = true;   // bool
$pseudonim = null;   // null

var_dump($imie);
var_dump($wiek);
var_dump($wzrost);
var_dump($aktywny);
var_dump($pseudonim);