Stałe define i const w PHP

> Dodaj do ulubionych

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.

  1. Funkcja define() definiuje stałe w czasie działania skryptu, a słowo kluczowe const — podczas kompilacji. To daje słowu kluczowemu const niewielką przewagę szybkościową nad funkcją, ale nie jest to coś, czym warto byłoby się przejmować, chyba że ktoś tworzy bardzo dużą aplikację.
  2. 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.
  3. Funkcja define() umożliwia używanie wyrażeń zarówno w nazwie stałej jak i jej wartości. Natomiast słowo kluczowe const nie daje takich możliwości. Z tego powodu funkcja define() jest elastyczniejsza.
  4. Funkcję define() można wywoływać w blokach if(), natomiast słowo kluczowe const 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ść.

Autor: Alex Cabal

Źródło: http://phpbestpractices.org/

Tłumaczenie: Łukasz Piwko

Treść tej strony jest dostępna na zasadach licencji CC BY-SA 3.0