Menu

Stałe w PHP: define() vs const i stałe magiczne

Stała w PHP to nazwa wartości, która nie może się zmienić: const MAX_USERS = 100; albo define('MAX_USERS', 100);. Poznaj define vs const, stałe tablicowe, stałe klas z self::, sprawdzanie przez defined() oraz stałe magiczne __LINE__, __FILE__, __DIR__ i __CLASS__.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Stała to nazwa wartości, która nie zmienia się podczas działania skryptu. Zadeklaruj ją przez const MAX_USERS = 100; albo define('MAX_USERS', 100);, a potem używaj samej nazwy, bez $.

Zgodnie z konwencją nazwy stałych zapisuje się jako UPPER_SNAKE_CASE. Stałe są globalne: stała zadeklarowana na początku pliku jest widoczna w każdej funkcji bez global.

define() vs const

Oba tworzą stałą, ale działają w różnym czasie. const jest rozwiązywane, gdy PHP kompiluje plik, a define() wykonuje się jak każde inne wywołanie funkcji.

constdefine()
W if, pętlach, funkcjachNieTak
Nazwa zbudowana ze zmiennejNieTak
Stałe klasTakNie
Wartość może być wyrażeniemTak, ze stałych i literałówTak, dowolna wartość
Automatycznie w przestrzeni nazwTakNie (podaj pełną nazwę)

Domyślnie używaj const, bo jest krótsze i sprawdzane przy kompilacji. Używaj define(), gdy stała zależy od warunku albo wyliczonej nazwy.

Stałych nie można zmienić

Przypisanie do stałej to błąd parsowania:

<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error:  syntax error, unexpected token "=" in /home/index.php on line 3

Dwukrotne zdefiniowanie tej samej stałej nie jest błędem, ale PHP wypisuje ostrzeżenie i zachowuje pierwszą wartość:

<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3

Gdy wartość może już być ustawiona (na przykład w pliku konfiguracyjnym ładowanym więcej niż raz), sprawdź najpierw przez defined():

Stałe tablicowe

Stała może przechowywać tablicę. Możesz ją czytać przez NAME[key], iterować po niej i przekazywać dalej, ale nie możesz jej zmieniać.

Stałe klas

W klasie const deklaruje stałą, która należy do klasy. Z zewnątrz czytasz ją przez ClassName::NAME, a od środka przez self::NAME albo static::NAME. Stałe klas mogą mieć widoczność, mogą być final, a od PHP 8.3 mogą deklarować typ.

Grupę powiązanych stałych klasy, jak STATUS_NEW i STATUS_PAID, często lepiej zapisać jako enum, który przy okazji nie pozwala przekazywać niepoprawnych wartości.

Stałe magiczne: LINE, FILE, DIR i inne

Stałe magiczne zmieniają wartość w zależności od miejsca, w którym się pojawiają. Są wypełniane przy kompilacji.

Najczęściej używana jest __DIR__, czyli katalog bieżącego pliku. Ścieżki do dołączanych plików zbudowane na jej podstawie działają niezależnie od katalogu, z którego uruchomiono skrypt: require __DIR__ . '/config.php';. Pełny wzorzec opisuje strona o include i require.

Wbudowane stałe, które warto znać

PHP definiuje wiele własnych stałych. Te pojawiają się cały czas:

PHP_EOL to znak końca linii systemu, na którym działa PHP ("\n" na Linuksie i macOS, "\r\n" na Windowsie). Służy do tekstu zapisywanego do plików i terminala; w wyjściu HTML znak nowej linii nie jest widoczny, więc tam użyj <br>.

Najczęściej zadawane pytania

Czym różni się define() od const w PHP?

const to konstrukcja językowa rozwiązywana przy kompilacji pliku: działa na najwyższym poziomie i w klasach, ale nie w if, pętlach ani funkcjach. define() to funkcja wywoływana w czasie działania, więc działa wszędzie, a nazwę można zbudować ze zmiennej, ale nie da się nią zadeklarować stałych klasy.

Czy stała w PHP może być tablicą?

Tak. Działają zarówno const COLORS = ['red', 'green'];, jak i define('COLORS', ['red', 'green']);, a element odczytasz przez COLORS[0]. Tablicy nie można potem zmienić.

Jak sprawdzić, czy stała jest zdefiniowana w PHP?

Użyj defined('NAME'), które przyjmuje nazwę jako łańcuch i zwraca true albo false. Typowy wzorzec to if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }. Dla stałych klas przekaż 'ClassName::NAME'.

Co to są stałe magiczne w PHP?

Stałe, których wartość zależy od miejsca, w którym są zapisane: __LINE__ (bieżąca linia), __FILE__ (pełna ścieżka pliku), __DIR__ (jego katalog), __FUNCTION__, __CLASS__, __METHOD__ i __NAMESPACE__. Zapisuje się je z dwoma podkreślnikami z każdej strony i nie rozróżniają wielkości liter.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ