Lekcja 4: Zmienne i typy danych w PHP

Witaj w czwartej lekcji kursu PHP! Po zapoznaniu się z podstawową składnią PHP, tagami i komentarzami, nadszedł czas na zgłębienie jednego z najbardziej fundamentalnych konceptów w każdym języku programowania: zmiennych i typów danych. Zmienne pozwalają na przechowywanie informacji, które mogą być używane i modyfikowane w trakcie działania skryptu, a typy danych określają rodzaj tych informacji i operacje, jakie można na nich wykonywać. Zrozumienie tych pojęć jest kluczowe do pisania dynamicznych i użytecznych programów w PHP.

Czym są zmienne w PHP?

Zmienne w programowaniu można sobie wyobrazić jako nazwane "pojemniki" lub "etykiety" w pamięci komputera, które przechowują wartości. Te wartości mogą być liczbami, tekstem, tablicami danych, obiektami i wieloma innymi rodzajami informacji. Główną cechą zmiennych jest to, że ich wartość może się zmieniać (stąd nazwa "zmienna") w trakcie wykonywania programu.

W PHP zmienne są reprezentowane przez znak dolara ($), po którym następuje nazwa zmiennej. Nazwy zmiennych muszą spełniać określone zasady:

Przykłady poprawnych nazw zmiennych:

<?php
$wiek;
$imieUzytkownika;
$_adresEmail;
$cena_produktu;
$MAX_LICZBA_UZYTKOWNIKOW; // Często używane dla stałych, ale poprawne też dla zmiennych
$a1;
?>

Przykłady niepoprawnych nazw zmiennych:

<?php
// $1a; // Zaczyna się od cyfry
// $adres-email; // Zawiera myślnik (dozwolone jest tylko podkreślenie)
// $nazwa użytkownika; // Zawiera spację
?>

Deklaracja i Inicjalizacja Zmiennych

PHP jest językiem o dynamicznym typowaniu. Oznacza to, że nie musisz jawnie deklarować typu zmiennej przed jej użyciem, ani nawet deklarować samej zmiennej w tradycyjnym sensie, jak w niektórych innych językach (np. C++ czy Java). Zmienna jest tworzona automatycznie w momencie pierwszego przypisania do niej wartości.

Przypisanie wartości do zmiennej odbywa się za pomocą operatora przypisania (=).

<?php
$nazwa = "PHP Kurs"; // Zmienna $nazwa jest tworzona i inicjalizowana wartością tekstową "PHP Kurs"
$rok = 2025;         // Zmienna $rok jest tworzona i inicjalizowana liczbą całkowitą 2025
$cena = 99.99;       // Zmienna $cena jest tworzona i inicjalizowana liczbą zmiennoprzecinkową 99.99
$czyAktywny = true;  // Zmienna $czyAktywny jest tworzona i inicjalizowana wartością logiczną true

echo $nazwa; // Wyświetli "PHP Kurs"
echo "<br>";
echo $rok;   // Wyświetli 2025
?>

Można również przypisać wartość jednej zmiennej do drugiej:

<?php
$pierwszaZmienna = "Jakaś wartość";
$drugaZmienna = $pierwszaZmienna; // $drugaZmienna teraz przechowuje kopię wartości "Jakaś wartość"

echo $drugaZmienna;
?>

Jeśli spróbujesz użyć zmiennej, której nie przypisano wartości, PHP wygeneruje ostrzeżenie (Notice: Undefined variable) i potraktuje ją tak, jakby miała wartość null (w zależności od kontekstu może to być też 0 lub pusty ciąg znaków).

Zasięg Zmiennych (Scope)

Zasięg zmiennej określa, gdzie w skrypcie dana zmienna jest dostępna (widoczna). PHP ma kilka rodzajów zasięgu:

Szczegółowo o zasięgu zmiennych, zwłaszcza w kontekście funkcji, powiemy więcej w lekcji poświęconej funkcjom.

Typy Danych w PHP

PHP obsługuje osiem podstawowych typów danych, które można podzielić na trzy kategorie:

1. Typy Skalarne (Scalar Types)

Typy skalarne przechowują pojedynczą wartość.

2. Typy Złożone (Compound Types)

Typy złożone pozwalają na przechowywanie wielu wartości.

3. Typy Specjalne (Special Types)

Sprawdzanie Typu Zmiennej

PHP dostarcza szereg funkcji wbudowanych do sprawdzania typu zmiennej. Są one bardzo przydatne, zwłaszcza w języku dynamicznie typowanym, gdzie typ zmiennej może się zmieniać.

<?php
$liczba = 123;
$tekst = "Witaj";
$wartoscLogiczna = true;
$tab = [1, 2, 3];
$nic = NULL;

echo gettype($liczba) . "<br>"; // integer
echo gettype($tekst) . "<br>"; // string

if (is_int($liczba)) {
    echo "Zmienna liczba jest liczbą całkowitą.<br>";
}

if (empty($nieistniejacaZmienna)) {
    echo "Zmienna nieistniejacaZmienna jest pusta.<br>";
}

if (isset($tekst)) {
    echo "Zmienna tekst jest ustawiona.<br>";
}
?>

Konwersja (Rzutowanie) Typów (Type Casting)

PHP często automatycznie konwertuje typy danych w zależności od kontekstu, w jakim są używane (tzw. type juggling lub loose typing). Na przykład, jeśli dodasz liczbę całkowitą do ciągu znaków, który zaczyna się od cyfr, PHP spróbuje przekonwertować ten ciąg na liczbę.

<?php
$liczbaJakoTekst = "5";
$wynik = $liczbaJakoTekst + 10; // PHP przekonwertuje "5" na liczbę całkowitą 5
echo $wynik; // Wyświetli 15
echo "<br>Typ wyniku: " . gettype($wynik); // integer

$tekst = "10 małych kotków";
$suma = $tekst + 5; // PHP przekonwertuje "10 małych kotków" na liczbę 10 (ignorując resztę)
echo "<br>" . $suma; // Wyświetli 15 (PHP 8: Warning: A non-numeric value encountered)
?>

Chociaż automatyczna konwersja typów może być wygodna, czasami może prowadzić do nieoczekiwanych rezultatów. Dlatego ważne jest, aby rozumieć, jak działa, i w razie potrzeby jawnie konwertować typy.

Jawna konwersja typów (rzutowanie) odbywa się poprzez umieszczenie nazwy docelowego typu w nawiasach przed zmienną lub wartością, którą chcemy przekonwertować:

<?php
$liczbaFloat = 123.789;
$liczbaInt = (int) $liczbaFloat;
echo $liczbaInt; // Wyświetli 123 (część ułamkowa jest obcinana)

$tekstLiczby = "999";
$liczbaZTekstu = (int) $tekstLiczby;
echo "<br>" . ($liczbaZTekstu + 1); // Wyświetli 1000

$wartosc = 0;
$wartoscLogiczna = (bool) $wartosc;
var_dump($wartoscLogiczna); // Wyświetli bool(false)

$tekst = "Hello";
// $rzutNaTablice = (array) $tekst; // Tworzy tablicę z jednym elementem: $rzutNaTablice[0] = "Hello"
// var_dump($rzutNaTablice);
?>

Można również użyć funkcji settype($zmienna, $typ), aby zmienić typ zmiennej na stałe.

Deklaracje Typów (Type Hinting / Type Declarations)

Od PHP 5 wprowadzono możliwość deklarowania typów dla parametrów funkcji (type hinting), a od PHP 7 również dla wartości zwracanych przez funkcje oraz dla właściwości klas (od PHP 7.4). Pozwala to na pisanie bardziej przewidywalnego i łatwiejszego do debugowania kodu, ponieważ PHP będzie sprawdzać, czy przekazywane i zwracane wartości są odpowiedniego typu.

<?php
// Deklaracja typu dla parametru i wartości zwracanej (PHP 7+)
function dodajLiczbyCalkowite(int $a, int $b): int {
    return $a + $b;
}

echo dodajLiczbyCalkowite(5, 10); // 15
// echo dodajLiczbyCalkowite(5.5, 10); // Spowoduje błąd TypeError w trybie ścisłym,
                                   // lub PHP spróbuje rzutować 5.5 na 5 w trybie domyślnym (coercive)

// Domyślnie PHP jest w trybie "coercive" (przymusowym), co oznacza, że spróbuje
// przekonwertować typ, jeśli to możliwe. Aby włączyć tryb ścisły, użyj:
declare(strict_types=1); // Musi być pierwszą instrukcją w pliku

function przywitaj(string $imie): string {
    return "Witaj, " . $imie;
}

echo "<br>" . przywitaj("Alicja");
?>

Deklaracje typów są bardzo ważnym elementem nowoczesnego programowania w PHP i będziemy do nich wracać przy omawianiu funkcji i programowania obiektowego.

Podsumowanie Lekcji

W tej obszernej lekcji nauczyliśmy się, czym są zmienne w PHP, jak je nazywać, deklarować i inicjalizować. Zrozumieliśmy, że PHP jest językiem dynamicznie typowanym. Zapoznaliśmy się z ośmioma podstawowymi typami danych: skalarnymi (bool, int, float, string), złożonymi (array, object, callable, iterable) oraz specjalnymi (null, resource). Omówiliśmy również, jak sprawdzać typ zmiennej za pomocą funkcji is_* i gettype(), a także jak jawnie konwertować (rzutować) typy. Na koniec wprowadziliśmy pojęcie deklaracji typów, które zwiększają solidność kodu.

Zrozumienie zmiennych i typów danych jest absolutnie fundamentalne. W następnej lekcji przyjrzymy się operatorom w PHP, które pozwalają na wykonywanie różnych operacji na tych zmiennych i wartościach.


Zadanie praktyczne

Napisz skrypt PHP, który wykonuje następujące czynności:

  1. Zadeklaruj zmienną $nazwaProduktu i przypisz jej wartość tekstową (np. "Laptop XYZ").
  2. Zadeklaruj zmienną $cenaNetto i przypisz jej wartość liczbową zmiennoprzecinkową (np. 2500.00).
  3. Zadeklaruj zmienną $stawkaVAT i przypisz jej wartość 0.23 (reprezentującą 23% VAT).
  4. Oblicz cenę brutto produktu ($cenaNetto + $cenaNetto * $stawkaVAT) i zapisz ją w zmiennej $cenaBrutto.
  5. Zadeklaruj zmienną $czyDostepny i przypisz jej wartość logiczną true.
  6. Wyświetl wszystkie te informacje w czytelny sposób, np.:
    Nazwa produktu: Laptop XYZ
    Cena netto: 2500.00 PLN
    Cena brutto: [obliczona cena brutto] PLN
    Dostępny: Tak (lub "Nie", w zależności od wartości $czyDostepny)
  7. Użyj funkcji gettype(), aby wyświetlić typ każdej ze zadeklarowanych zmiennych ($nazwaProduktu, $cenaNetto, $cenaBrutto, $czyDostepny).

Pokaż przykładowe rozwiązanie
<?php
$nazwaProduktu = "Laptop XYZ";
$cenaNetto = 2500.00;
$stawkaVAT = 0.23;

$cenaBrutto = $cenaNetto + ($cenaNetto * $stawkaVAT);

$czyDostepny = true;

echo "Nazwa produktu: " . $nazwaProduktu . "<br>";
echo "Cena netto: " . number_format($cenaNetto, 2, ',', ' ') . " PLN<br>"; // Formatowanie liczby
echo "Cena brutto: " . number_format($cenaBrutto, 2, ',', ' ') . " PLN<br>";
echo "Dostępny: " . ($czyDostepny ? "Tak" : "Nie") . "<br>"; // Użycie operatora trójargumentowego

echo "<hr>Typy zmiennych:<br>";
echo "Typ \$nazwaProduktu: " . gettype($nazwaProduktu) . "<br>"; // string
echo "Typ \$cenaNetto: " . gettype($cenaNetto) . "<br>";     // double (float)
echo "Typ \$cenaBrutto: " . gettype($cenaBrutto) . "<br>";    // double (float)
echo "Typ \$czyDostepny: " . gettype($czyDostepny) . "<br>";   // boolean
?>
            

Zadanie do samodzielnego wykonania

Stwórz skrypt PHP, w którym zadeklarujesz zmienne przechowujące Twoje imię, wiek (jako liczbę) oraz miasto (jako tekst). Następnie, używając konkatenacji (łączenia) ciągów znaków, stwórz jedną zmienną $opis, która będzie zawierać zdanie w stylu: "Nazywam się [imię], mam [wiek] lat i mieszkam w [miasto].". Wyświetl zawartość zmiennej $opis. Spróbuj użyć zarówno apostrofów, jak i cudzysłowów do definiowania ciągów znaków i zaobserwuj różnice w parsowaniu zmiennych.


FAQ - Zmienne i Typy Danych w PHP

Jaka jest maksymalna wartość dla typu int w PHP?

Maksymalna wartość dla typu int zależy od architektury systemu (32-bitowej lub 64-bitowej). Możesz sprawdzić stałą PHP_INT_MAX, aby poznać maksymalną wartość na Twoim serwerze. Na systemach 64-bitowych jest to zazwyczaj bardzo duża liczba (około 9 * 10^18).

Czy PHP obsługuje liczby zespolone?

Nie, PHP nie ma wbudowanego wsparcia dla liczb zespolonych jako osobnego typu danych. Operacje na liczbach zespolonych musiałyby być zaimplementowane za pomocą klas lub tablic przechowujących część rzeczywistą i urojoną, wraz z odpowiednimi funkcjami do operacji arytmetycznych.

Jak sprawdzić, czy ciąg znaków zawiera tylko cyfry?

Możesz użyć funkcji ctype_digit($tekst), która zwraca true, jeśli wszystkie znaki w ciągu są cyframi, lub is_numeric($tekst), która jest bardziej ogólna i sprawdza, czy ciąg reprezentuje liczbę (może zawierać np. znak plus/minus lub kropkę dziesiętną).

Co to są "zmienne zmiennych" (variable variables) w PHP?

Zmienne zmiennych pozwalają na użycie wartości jednej zmiennej jako nazwy innej zmiennej, np. $nazwa = "wiek"; $$nazwa = 30; (co jest równoważne $wiek = 30;). Jest to potężna, ale potencjalnie myląca funkcja, której należy używać ostrożnie.

Czy mogę zmienić typ zmiennej po jej zadeklarowaniu?

Tak, ponieważ PHP jest językiem dynamicznie typowanym, możesz przypisać zmiennej wartość innego typu w dowolnym momencie. Na przykład, zmienna, która początkowo przechowywała liczbę, może później przechowywać ciąg znaków. Typ zmiennej jest określany przez wartość, którą aktualnie przechowuje.

Jaka jest różnica między NULL, pustym ciągiem "" a wartością 0?

Są to różne wartości i typy. NULL oznacza brak wartości. Pusty ciąg "" to ciąg znaków o zerowej długości. Liczba 0 to wartość numeryczna. Chociaż w pewnych kontekstach (np. przy luźnym porównaniu == lub w warunkach logicznych) mogą być traktowane podobnie (jako "fałszywe"), są to odrębne byty.

Do czego służy funkcja var_dump()?

Funkcja var_dump() jest niezwykle przydatna do debugowania. Wyświetla ona informacje o jednej lub więcej zmiennych, w tym ich typ, wartość oraz (dla tablic i obiektów) ich strukturę i zawartość. Jest bardziej szczegółowa niż echo czy print_r().

Czy nazwy zmiennych mogą zawierać polskie znaki?

Technicznie PHP pozwala na używanie liter spoza standardowego zestawu ASCII (w tym polskich znaków diakrytycznych) w nazwach zmiennych, jeśli plik jest odpowiednio zakodowany (np. UTF-8). Jednak powszechną i zalecaną praktyką jest używanie wyłącznie liter angielskich, cyfr i znaku podkreślenia w nazwach identyfikatorów, aby zapewnić maksymalną kompatybilność i czytelność kodu w międzynarodowym środowisku.