Używaj funkcji define()
jeśli nie musisz przejmować się czytelnością, stałymi klasowymi ani mikrooptymalizacjami.
W PHP tradycyjnie stałe definiowało się za pomocą funkcji define()
, ale w którejś wersji języka dodano też możliwość definiowania stałych za pomocą słowa kluczowego const
. I powstał dylemat, która metoda jest lepsza?
Odpowiedzi należy szukać w drobnych różnicach dzielących te dwie techniki.
- Funkcja
define()
definiuje stałe w czasie działania skryptu, a słowo kluczoweconst
— podczas kompilacji. To daje słowu kluczowemuconst
niewielką przewagę szybkościową nad funkcją, ale nie jest to coś, czym warto byłoby się przejmować, chyba że ktoś tworzy bardzo dużą aplikację. - Stałe zdefiniowane za pomocą funkcji
define()
należą do zakresu globalnego, chociaż można do ich nazw dodawać przestrzenie nazw. Oznacza to, że za pomocą tej funkcji nie można definiować stałych klasowych. - Funkcja
define()
umożliwia używanie wyrażeń zarówno w nazwie stałej jak i jej wartości. Natomiast słowo kluczoweconst
nie daje takich możliwości. Z tego powodu funkcjadefine()
jest elastyczniejsza. - Funkcję
define()
można wywoływać w blokachif()
, natomiast słowo kluczoweconst
nie może się w nich pojawiać.
Przykład
<?php
// porównany sposób pracy z przestrzeniami nazw w obu technikach
namespace MiddleEarth\Creatures\Dwarves;
const GIMLI_ID = 1;
define('MiddleEarth\Creatures\Elves\LEGOLAS_ID', 2);
echo(\MiddleEarth\Creatures\Dwarves\GIMLI_ID); // 1
echo(\MiddleEarth\Creatures\Elves\LEGOLAS_ID); // 2, zwróć uwagę, że użyliśmy funkcji define(), a przestrzeń nazw i tak została rozpoznana
// Teraz zadeklarujemy stałe o wartości przesuniętej bitowo reprezentującej wejście do Mordoru.
define('TRANSPORT_METHOD_SNEAKING', 1 << 0); // OK!
const TRANSPORT_METHOD_WALKING = 1 << 1; // błąd kompilacji — wartością const nie może być wyrażenie
// stałe w warunkach
define('HOBBITS_FRODO_ID', 1);
if($isGoingToMordor){
define('TRANSPORT_METHOD', TRANSPORT_METHOD_SNEAKING); // OK!
const PARTY_LEADER_ID = HOBBITS_FRODO_ID // błąd kompilacji — const nie można używać w blokach if
}
// stałe w klasach
class OneRing{
const MELTING_POINT_CELSIUS = 1000000; // OK!
define('MELTING_POINT_ELVISH_DEGREES', 200); // błąd kompilacji — nie można używać funkcji define() w klasach
}
?>
Jako że funkcja define()
jest o wiele elastyczniejsza od słowa kluczowego const
, należy jej używać, aby nie mieć kłopotów, chyba że potrzebne są definicje stałych w klasach. Kod ze słowem kluczowym const
jest z reguły czytelniejszy, choć ceną za to jest elastyczność.