W PHP (i w każdym chyba języku programowania) oprócz zmiennych istnieją również stałe. Jak łatwo się domyślić z nazwy, przyjmują one jedną wartość podczas definicji i nie można jej później zmienić operatorem przypisania. Zastosowanie stałych nie dla wszystkich jest oczywiste, początkujący programiści często nie doceniają wygody i przydatności ich stosowania. W tym artykule przedstawiam kilka z życia wziętych przykładów zastosowania stałych.
Na początek jednak trochę teorii. Oto sposoby definiowania stałych w PHP:
1 2 | define('STALA', 10) // definicja stałej STALA o wartości 10 const INNA_STALA = 20; // od PHP 5.3.0: definicja stałej INNA_STALA o wartości 20 |
Osobiście preferuję pierwszy sposób z powodu jego wszechstronności: w funkcji define() za nazwę stałej możemy podać zmienną o danej wartości.
Pomimo iż w nazwach stałych dopuszczalne jest nazewnictwo takie same, jak u zmiennych (małe i wielkie litery, cyfry i znak podkreślenia), przyjęło się, iż stałe powinny mieć nazwy pisane wielkimi literami.
Do stałych w kodzie odwołujemy się w następujący sposób:
W przypadku definiowania stałych funkcją define() i zmienną w pierwszym parametrze, zmienna ta może zawierać dowolnego stringa. Gdy string ten zawiera znaki niedozwolone w przypadku normalnego nazywania stałych, możemy do tej stałej odwołać się jedynie poprzez funkcję constant(). W pozostałych przypadkach najlepiej jest po prostu wstawić nazwę stałej w danym miejscu kodu. Przy definiowaniu stałych wielkość liter jest rozróżniana. W przypadku odwołania się do nieistniejącej stałej generowany jest również notice, a nazwa nieistniejącej stałej, którą podaliśmy, zostaje przyjęta za jej wartość. Przykład:
1 2 3 4 | define('JAKAS_STALA', 123); echo Jakas_stala; // generowany jest notice o treści // "Use of undefined constant Jakas_stala - assumed 'Jakas_stala'" // i wyświetlony zostanie napis "Jakas_stala" |
Aby sprawdzić, czy stała o danej wartości istnieje, używamy funkcji defined(). Przykład użycia:
To na tyle teorii, przejdźmy do praktycznych zastosowań.
Często stosowane wartości
Weźmy za przykład skrypt, który dzieli dużą ilość newsów na strony. Musimy znać liczbę elementów, które mają się jednorazowo pojawiać na stronie, numer aktualnej strony oraz wyliczyć ilość wszystkich stron, aby móc znać odniesienie do ostatniej strony. Zakładając, że ilość elementów na stronę to 10, przykładowy fragment kodu wyglądałby tak:
1 2 3 4 |
Liczba 10 pojawia się w powyższym kodzie trzy razy. Co w wypadku, gdy okaże się, że nie chcemy by elementów było 10, tylko 5? Musimy trzy razy zastąpić ręcznie dziesiątkę piątką. Sytuacja dodatkowo komplikuje się, gdy taki skrypt używany jest kilka razy.
Dodatkowo, liczba 10 jest tutaj zwykłą liczbą, nieprzypisaną do żadnej zmiennej. Co to za liczba? Co oznacza i do czego służy? Patrząc na ten kod nie jest to takie oczywiste, a im później do niego wrócimy, tym mniejsza szansa, że będziemy wiedzieli o co w nim chodzi.
Rozwiązanie z użyciem stałych jest dużo wygodniejsze jeśli chodzi o użyteczność i przejrzystość kodu. Na początku pliku definiujemy stałą o nazwie ITEMS_PER_PAGE i wartości 10:
1 |
Później w poprzednim skrypcie zamieniamy każdą dziesiątkę na naszą stałą:
1 2 3 4 |
W tym wypadku, gdy chcemy zmienić liczbę elementów na stronie, wystarczy tylko zmienić wartość w funkcji define().
Parametry funkcji
W PHP istnieje wiele predefiniowanych stałych, które znajdują zastosowanie w wielu miejscach. I tak na przykład funkcja preg_match_all() za czwarty parametr może przyjąć trzy stałe: PREG_PATTERN_ORDER, PREG_SET_ORDER i PREG_OFFSET_CAPTURE. Ich wartości to odpowiednio 1, 2 i 256. Teoretycznie liczby są krótsze i szybciej się je zapisze, jednak o ile czytelniej i łatwiej w zapamiętaniu używać stałych? Jeszcze bardziej użyteczny przykład ma się z typami plików w GD. Co jest czytelniejsze i łatwiejsze do zapamiętania:
1 2 |
czy
1 2 | getimagesize($image, list($width, $height, $type)); if ($type == IMAGETYPE_JPEG) { echo "to jest JPG"; } |
?
Definiowanie stałych ułatwia życie przy pisaniu funkcji, w których parametry mogą mieć jedną z kilku dopuszczalnych wartości. Warto zaznaczyć, że w takich przypadkach jak podano najlepiej sprawdzają się stałe będące liczbami naturalnymi – porównywanie ich jest dużo szybsze niż porównywanie łańcuchów znaków.
Co ciekawe, stałe jeszcze bardziej ułatwiają życie, gdy potrzebujemy funkcji, w których jeden parametr może przyjąć kilka niezależnych wartości. Tutaj pojawiają się flagi.
Flagi
Flagi są stałymi przyjmującymi za wartości kolejne potęgi dwójki (1, 2, 4, 8, 16…). Używając ich, bardzo łatwo można ustalić, czego akurat wymagamy od funkcji.
Napiszmy przykładową funkcję walidującą dane w formularzu. Załóżmy, że dopuszczamy podanie przez użytkownika danych składających się tylko z małych liter, tylko z wielkich liter, tylko z cyfr oraz dowolnych kombinacji wymienionych. Na początku definiujemy stałe, które będą używane jako flagi.
W jaki sposób możemy ustawić więcej niż jedną flagę? Służy do tego operator binarny OR: | (pojedyncza pionowa kreska – nie mylić z operatorem logicznym, podwójną pionową kreską). Sprawdzenie, czy dana flaga jest ustawiona odbywa się z użyciem operatora binarnego AND: & – pojedynczy ampersand. Zdefiniujmy naszą funkcję:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function waliduj($dane, $flagi = 0) { if ($flagi == 0) return 1; // żadna flaga nie jest ustawiona - wszystkie dane są poprawne - zwracamy wynik $wyrazenie = '/[^'; // łańcuch, który posłuży nam do budowy wyrażenia regularnego // dokładamy znaki do zbioru, z którego znaki nie powinny wystąpić w sprawdzanym łańcuchu if ($flagi & LOWERCASE) $wyrazenie .= 'a-z'; if ($flagi & UPPERCASE) $wyrazenie .= 'A-Z'; if ($flagi & DIGITS) $wyrazenie .= '0-9'; $wyrazenie .= ']/'; // jeśli w wyrażeniu znajdują się znaki spoza zbioru, zwracamy fałsz if (preg_match($wyrazenie, $dane)) { return 0; } else { return 1; } } |
Dla tych pierwszy raz widzących wyrażenia regularne: zaczynać i kończyć się muszą one dowolnym niealfanumerycznym znakiem (najczęściej używa się slasha). Nawiasy kwadratowe służą do wyodrębnienia zbioru znaków, który ma się pojawić w łańcuchu. Jeśli zaraz po lewym nawiasie występuje znak ^, wówczas wyrażenie dotyczy wszystkich znaków spoza tego zbioru.
Przykładowe wywołania funkcji z ustawionymi flagami:
1 2 3 4 | waliduj('Tekst', LOWERCASE); // zwróci 0 waliduj('Tekst', LOWERCASE | UPPERCASE); // zwróci 1 waliduj('T3kst', LOWERCASE | UPPERCASE); // zwróci 0 waliduj('T3kst', LOWERCASE | UPPERCASE | DIGITS); // zwróci 1 |
Notka: w pierwszym przypadku sprawdzane wyrażenie regularne to /[^a-z]/, w drugim i trzecim: /[^a-zA-Z]/, a w czwartym /[^a-zA-Z0-9]/. Więcej o wyrażeniach regularnych w kolejnym tutorialu.
To by było na tyle. Mam nadzieję, że art się przyda, itd, itp
Jest to moje pierwsze dzieło tego typu, więc nie szczędzić krytyki ani pomysłów na kolejne tutoriale w komentarzach.




















