Stałe — const i define
🎯 Po tej lekcji zdefiniujesz własne stałe i będziesz wiedzieć, kiedy użyć stałej zamiast zmiennej.
W każdym sklepie jest kilka wartości, które nigdy się nie zmieniają: stawka VAT, nazwa firmy, maksymalna liczba produktów na stronie. Można je wpisywać ręcznie w każdym miejscu kodu — ale to proszenie się o kłopoty. Wystarczy, że zmienisz stawkę VAT, a musisz przeszukać cały projekt. Stała rozwiązuje ten problem.
Czym jest stała?
Stała to nazwana wartość, która — w odróżnieniu od zmiennej — nie może być zmieniona po zdefiniowaniu. Jeśli spróbujesz ją nadpisać, PHP zgłosi błąd.
<?php
declare(strict_types=1);
const STAWKA_VAT = 0.23;
echo STAWKA_VAT; // wynik: 0.23
// STAWKA_VAT = 0.08; // PHP Error: Cannot redefine constant
Zwróć uwagę: stała nie ma znaku $. Używasz po prostu jej nazwy.
Konwencja nazewnictwa
Przyjęta konwencja (i standard PSR) nakazuje pisać stałe WIELKIMI_LITERAMI z podkreślnikami. Dzięki temu od razu widać, że to stała, a nie zmienna:
<?php
declare(strict_types=1);
const MAX_ROZMIAR_PLIKU = 5242880; // 5 MB w bajtach
const DOZWOLONE_ROZSZERZENIA = ['jpg', 'png', 'gif'];
const WERSJA_APLIKACJI = '2.1.0';
const TRYB_DEBUG = false;
Definicja przez const
const to słowo kluczowe — podobne do function czy class. Używaj go na poziomie globalnym lub wewnątrz klas:
<?php
declare(strict_types=1);
const STAWKA_VAT = 0.23;
const NAZWA_SERWISU = 'phpedia.pl';
const LIMIT_WYNIKOW = 20;
// Używasz stałej tak samo jak zmiennej, tylko bez $
$cenaNetto = 100.0;
$cenaBrutto = $cenaNetto * (1 + STAWKA_VAT);
echo "Cena brutto: $cenaBrutto PLN"; // wynik: Cena brutto: 123 PLN
Definicja przez define()
define() to funkcja, która działa w czasie wykonania skryptu (runtime). Możesz jej użyć wewnątrz bloku if lub funkcji — coś, czego const nie pozwala:
<?php
declare(strict_types=1);
$srodowisko = 'produkcja';
if ($srodowisko === 'developerskie') {
define('TRYB_DEBUG', true);
} else {
define('TRYB_DEBUG', false);
}
var_dump(TRYB_DEBUG); // wynik: bool(false)
const — jest czytelniejszy i szybszy. Sięgaj po define() tylko wtedy, gdy wartość stałej zależy od warunków wykonania skryptu.Stałe wbudowane w PHP
PHP sam definiuje wiele przydatnych stałych:
<?php
declare(strict_types=1);
echo PHP_VERSION; // wynik: 8.3.x — wersja PHP
echo PHP_INT_MAX; // wynik: 9223372036854775807 — maks. int
echo PHP_EOL; // wynik: \n (Linux/Mac) lub \r\n (Windows) — znak nowej linii
echo PHP_MAJOR_VERSION; // wynik: 8
echo DIRECTORY_SEPARATOR; // wynik: / (Linux/Mac) lub \ (Windows) — separator ścieżek
Szczególnie przydatne jest PHP_EOL w skryptach konsolowych i DIRECTORY_SEPARATOR przy operacjach na plikach — zapewniają przenośność między systemami.
Porównanie: stała vs zmienna
| | Zmienna $cena | Stała CENA_MIN |
|---|---|---|
| Znak $ | Tak | Nie |
| Można nadpisać | Tak | Nie |
| Konwencja | camelCase | WIELKIE_LITERY |
| Zasięg | Lokalny (funkcja) lub globalny | Globalny (wszędzie) |
| Kiedy używać | Wartości zmieniające się w czasie | Wartości stałe w całym projekcie |
<?php
declare(strict_types=1);
// Stałe — konfiguracja aplikacji
const STAWKA_VAT = 0.23;
const MAX_PRODUKTOW_NA_STRONIE = 12;
const WALUTA = 'PLN';
// Zmienne — dane konkretnego produktu
$cena = 49.99;
$sztuki = 3;
$suma = $cena * $sztuki;
$sumaBrutto = round($suma * (1 + STAWKA_VAT), 2);
echo "Do zapłaty: $sumaBrutto " . WALUTA;
// wynik: Do zapłaty: 184.46 PLN
Sprawdź się
Czym różni się stała od zmiennej?
Stałej nie można nadpisać po jej zdefiniowaniu — to właśnie odróżnia ją od zmiennej. Próba nadpisania stałej powoduje błąd.
Która konwencja jest przyjęta dla nazw stałych w PHP?
Konwencja PHP (i PSR) nakazuje pisać stałe WIELKIMI_LITERAMI z podkreślnikami. Pomaga to odróżnić stałe od zmiennych na pierwszy rzut oka.
Jak odwołujesz się do stałej w kodzie?
Stałe w PHP nie mają znaku $. Używasz po prostu jej nazwy: STAWKA_VAT, MAX_PLIKU itp.
Ćwiczenie
Zdefiniuj stałe dla sklepu: NAZWA_SKLEPU (string), STAWKA_VAT (float 0.23) i MAX_PRODUKTOW_NA_STRONIE (int 12). Wyświetl zdanie: 'Sklep [nazwa] pokazuje maksymalnie [max] produktów. Ceny zawierają VAT [vat*100]%.'
Pokaż rozwiązanie
<?php
declare(strict_types=1);
const NAZWA_SKLEPU = 'Sklep Oli';
const STAWKA_VAT = 0.23;
const MAX_PRODUKTOW_NA_STRONIE = 12;
$vatProc = (int) (STAWKA_VAT * 100);
echo NAZWA_SKLEPU . ' pokazuje maksymalnie ' . MAX_PRODUKTOW_NA_STRONIE
. ' produktów. Ceny zawierają VAT ' . $vatProc . '%.';
// wynik: Sklep Oli pokazuje maksymalnie 12 produktów. Ceny zawierają VAT 23%.