Coś lekkiego i strawnego dzisiaj. Stałe – jak sama nazwa mówi z reguły elementy niezmienne w czasie działania skryptu, a wykorzystywane jedynie do np. porównywania. Takim standardowym przykładem może być przypisanie wartości pi do stałej.
Stałe w PHP definiujemy za pomocą funkcji boolowskiej define(str nazwa, mix wartość[, bool wrażliwość_na_wielkość_znaków]). Jak to wygląda praktycznie?
define('STALA_1', 'wartość w opcji z wrażliwością na wielkość znaków nazwy'); // standardowa definicja
define('STALA_2', 'wartość w opcji bez wrażliwości na wielkość znaków nazwy', true); // definicja rozszerzona
Dlaczego nazwy są nadane dużymi literami? To po prostu taki programistyczny zwyczaj dotyczący semantyki języka. I teraz dla testu możemy wywołać sobie poniższe elementy składni języka wyświetlające stałe na ekran.
echo STALA_2 . ' == ' . stala_2; // wyświetli "wartość w opcji z wrażliwością na wielkość znaków nazwy == wartość w opcji z wrażliwością na wielkość znaków nazwy" z racji tego, że został nadany trzeci parametr funkcji który pozwala na używanie nazw stałych w jakichkolwiek formach wielkości liter
echo STALA_1 . ' != ' . stala_1; // wyświetli "wartość w opcji z wrażliwością na wielkość znaków nazwy != stala_1" ponieważ nie został nadany trzeci parametr funkcji więc nazwy domyślnych stałych "STALA_1" i "stala_1" oznaczają co innego. Dodatkowo zostanie nadane domyślnie ukryte powiadomienie o użyciu nieistniejącej stałej "stala_1"
Należy też pamiętać, że nazwa stałej powinna być stringiem, dlatego nie należy rozpoczynać jej od cyfry. Wartość może być różnego typu, poczynając od stringa, przechodząc przez inta, a kończąc na wartości logicznej.
Jest także inny sposób na wyświetlanie stałych, szczególnie przydatny gdy np. nie możemy wyświetlić wartości stałej w standardowy sposób z powodu np. pobierania jej nazwy z funkcji lub w pętli. Tym sposobem jest użycie funkcji constant(str nazwa), gdzie nazwa to nazwa stałej wcześniej zdefiniowanej.
function get_constant()
{
return 'CONST';
}
define('CONST', 'wartosc');
print constant(get_constant()); // zwraca 'wartosc'
Sposób powyższy działa też w przypadku stałych w klasach o których teraz napiszę. Podstawowe zasady to, że nie możemy do takich stałych odnosić się bezpośrednio poprzez instancję obiektu. Przynajmniej w wersjach PHP poniżej 5.3 (w tej wersji dozwolona jest referencja do klasy poprzez zmienną i wywołanie stałej poprzez obiekt). Ich wartość musi być nadana, nie może to być np. rezultat wywołania funkcji czy element klasy. Dostęp wewnątrz klasy do stałej odbywa się poprzez statyczny obiekt self::.
class stale
{
const testowa_stala = 'testowa wartosc';
function stale()
{
print self::testowa_stala;
print constant('self::testowa_stala'); // wersja z użyciem funkcji constant
}
}
$obiekt = new stale(); // wywoła konstruktor wyświetlający dwukrotnie wartość stałej
Co można zauważyć dostęp do stałej statycznie z zewnątrz klasy nie będzie możliwy. Tak więc poniższa metoda odwołania jest nieprawidłowa.
$obiekt::testowa_stala;
Kolejna sprawa, bardziej praktyczna. Jak sprawdzić, czy stała została zdefiniowana? Należy użyć funkcji defined(str nazwa), która w parametrze przyjmuje nazwę sprawdzanej stałej. Funkcja jest typu logicznego więc zwraca wartości prawda / fałsz. Jeszcze raz jednak przypominam, że należy jej używać tylko do sprawdzania stałych.
if ( defined('NIEISTNIEJACA_STALA') === true ) // zastosowano operator porównania logicznego z powodu typu zwracanego przez funkcję
{
echo 'Istnieje: ' . NIEISTNIEJACA_STALA;
}
else {
echo 'Stała nie istnieje!'; // wynik w tym wypadku
}
No i ostatnią sprawą z zakresu tej tematyki jest pytanie jak wyświetlić informacje o wszystkich zadeklarowanych stałych? Należy użyć get_defined_constants(mix kategoryzacja). Parametr ten został dodany w PHP5 i powoduje kategoryzację wyników na dwa wymiary (klucze stałych i wartości).
define('NIEISTNIEJACA_STALA', 'abc');
define("STALA", 1);
print_r(get_defined_constants()); // wynik można przepuścić przez pętlę w celu uzyskania bardziej specyficznych wyników
Zapraszam do zapoznania się także z powiązanymi artykułami:
Wpis ten został opublikowany dnia:
wtorek, 25 Marzec 2008 o godzinie 0:55
w działach PHP, Webhosting.
Możesz śledzić rozwój tematu, w tym odpowiedzi dla tego artykułu poprzez kanał informacyjny RSS 2.0.
Możesz także zostawić swój komentarz lub trackbackować ze swojej własnej strony.
Próbuję znaleźć, ale nie bardzo mogę – czy istnieje możliwość pobrania zdefiniowanych w klasie stałych (const)? Mam klasę, która zawiera wiele zagnieżdżonych definicji elementów (np składam z nich duży obrazek – scenkę) i używam stałych PIERWSZY_PLAN, GRACZ, DRZEWO_1, DRZEWO_2 itd itp – problem polega na tym, że „debugując” (wyświetlając) składanie obrazka mam same stałe (stałe są integerami, żeby było łatwiej) – chciałbym wyświetlić nazwę stałej odpowiadającej określonemu numerowi (wszystkie numery są unikalne)… i nie bardzo wiem, jak można to zrobić…
Popraw mnie, jeśli źle Cię zrozumiałem. Masz w klasie zdefiniowane stałe (PIERWSZY_PLAN, GRACZ, itp.) o wartościach typu int, z czego wartości te są unikalne. Tak?
Jeśli tak to mogę Ci przedstawić dwa sposoby, niestety obydwa… z ograniczeniami ;]
Pierwszy, na pewno nie działa na PHP >= 5 (pisane z głowy bo niestety nie mam serwera z php4 do przetestowania na stanie aktualnie).
class constants { const F = 1; const S = 2; const T = 3; private static $find = 2; // szukane public static function getName() { $constants = get_defined_constants(); return array_search(self::$find, $constants, true); // zwraca nazwe stalej } } constants::getName();Drugi – który zalecam. Korzysta on z wbudowanego w PHP5 API Reflection.
class constants { const F = 1; const S = 2; const T = 3; private static $find = 2; // szukane public static function getName() { $apiHandle = new ReflectionClass('constants'); return array_search(self::$find, $apiHandle->getConstants(), true); // zwraca nazwe stalej } } constants::getName();Można by dla większej kompatybilności manualnie zapisywać w jakieś tablicy nazwy używanych stałych i je przeszukiwać, ale to droga zupełnie naokoło. Oczywiście przykłady są tylko pokazowe, do indywidualnego udoskonalenia.
Jeśli nie o to chodziło to śmiało pisz, bo możliwe że źle Cię zrozumiałem ;]
[...] definiowaniu stałych w zakresie ogólnym PHP już pisałem. Przybliżę jednak samą kwestię ich użycia w klasach, gdyż tam jest to niewystarczająco [...]