Stałe w klasach oraz różnice między static a self w PHP

KURS PHP

Wprowadzenie do stałych w PHP

Jeśli kiedykolwiek zastanawiałeś się, jakie magiczne zaklęcia kryją się w kodzie PHP, to musisz wiedzieć, że jednym z najpotężniejszych narzędzi, które możesz wykorzystać, są stałe. Wyobraź sobie, że piszesz opowieść o podróżach; stałe w PHP to jak podstawowe zasady, które kierują tą narracją. Nie zmieniają się, są niezawodne i pozwalają nigdy nie tracić z oczu najważniejszych faktów.
Ale co to właściwie znaczy w kontekście programowania obiektowego? Przygotuj się na bardziej szczegółową eksplorację tego tajemniczego świata.

Stałe, z definicji, to wartości, które pozostają niezmienne w trakcie działania programu. W PHP wprowadzamy je za pomocą słowa kluczowego const">const">const">const">const">const">const">const, a ich deklaracja odbywa się najczęściej wewnątrz klas. Gdy poznasz tę podstawową zasady, odkryjesz całą paletę możliwości. Ale dlaczego stałe są tak kluczowe? Otóż dzięki nim możesz łatwo zarządzać wartościami, które powinny pozostać niezmienne – na przykład ścieżki do zasobów, klucze API czy parametry konfiguracyjne.

Wyobraź sobie, że tworzysz aplikację, która ciągle wymaga dostępu do określonego adresu URL. Zamiast twardo kodować ten adres w każdym miejscu, w którym go używasz, możesz stworzyć stałą. Wtedy, jeśli kiedykolwiek potrzebujesz go zmienić, wystarczy, że aktualizujesz jedną linię kodu. To jak posiadanie mapy skarbów, gdzie zawsze wiesz dokąd iść, ale tylko musisz raz na jakiś czas aktualizować punkt startowy. Niesamowite, prawda?

W PHP istnieje kilka konwencji i zasad dotyczących stałych, które warto znać:

  • Nazwy stałych są najczęściej pisane wielkimi literami, aby od razu można je było zidentyfikować w kodzie.
  • Na przykład, PI zwykle odnosi się do wartości liczby pi - 3.14..., a w większości przypadków można to po prostu uznać za święty graal matematyki.
  • Nie chciałbyś, aby Twoi koledzy po fachu błądzili w gąszczu zmiennych, zamiast korzystać z prostej, niezmiennej wartości.

Jednak stałe to nie tylko te „edycje zen” w twoim kodzie. Mają wiele zastosowań w programowaniu obiektowym, szczególnie w kontekście klas. Kiedy definiujesz stałą w klasie, można ją łatwo odwołać używając operatora ::, co jakkolwiek brzmi jak zaklęcie, ale w rzeczywistości to zasada dostępu do pola statycznego.
Możliwość zaszyfrowania niezłomnych wartości w klasach zwiększa czytelność i organizację kodu.

Każdy programista, niezależnie od stopnia zaawansowania, doceni moc i prostotę, jaką oferują stałe. Bez względu na to, czy piszesz małą aplikację internetową, czy budujesz skomplikowane systemy zarządzania, stałe mogą być Twoim najlepszym przyjacielem w zachowaniu porządku i przewidywalności w kodzie. Poza tym, są jak dobry komiks - z niezłomnymi bohaterami i jednoznaczną grafiką, które przyciągają wzrok i zarazem koją umysł.

Teraz, gdy masz już zarys tego, co oznaczają stałe w PHP, możemy zagłębić się w różnice między static a self w kolejnych częściach. Jak można się domyślić, to nie tylko semantyka, ale i praktyczne zastosowanie, które może zdefiniować, czy Twój kod będzie wznosił się ku niebu, czy tonął w odmętach nieczytelności. Przekonajmy się zatem, gdzie te różnice mogą wpłynąć na sposób, w jaki podchodzisz do programowania. Otwarte umysły, przygotujcie się na podróż!

Przyjrzyjmy się teraz z bliska, czym tak naprawdę są te stałe w klasach, które w PHP pełnią rolę czegoś więcej niż tylko pojęcia programistycznego. Można je porównać do cegiełek w murze - niezmiennych, zawsze obecnych, które stanowią solidną podstawę Twojej architektury kodu. Niezależnie od tego, jak mocno zamierzasz manipulować innymi aspektami swojej klasy, te stałe pozostaną nietknięte, będąc latarnią wskazującą kierunek dla Twoich przyszłych działań.

Stałe są tak naprawdę "nimi" (nawet jeżeli brzmi to zabawnie) - mają swoje miejsce w klasie i są dostępne dla wszystkich metod w tej klasie, a ich wartość jest przypisana w chwili, gdy są definiowane. W PHP dla zdefiniowania stałych w klasie używamy słowa kluczowego const">const">const">const">const">const">const">const. W przeciwieństwie do zmiennych, stałe w PHP nie mogą być zmieniane w trakcie trwania działania skryptu. Wyobraź sobie, że masz ustaloną datę urodzenia – nie zmienisz jej nawet o dzień, prawda? To samo dotyczy stałych.

Jak można zauważyć, w poprzednim przykładzie stworzyliśmy stałą VERSION, którą możemy wykorzystać w metodzie. Użycie self:: pozwala nam odwołać się do stałych wewnątrz klasy. Ciekawostka: stałe w klasach są dostępne bezpośrednio przez nazwę klasy, co oznacza, że nawet jeśli nie masz instancji klasy, możesz uzyskać dostęp do stałych. Po prostu użyj ClassName::CONSTANT_NAME. Czyż to nie jest wygodne?

Najczęściej używane stałe to takie, które definiują wartości konfiguracyjne lub wersję aplikacji, ale możliwe jest ich wykorzystanie na wiele różnych sposobów. Na przykład, w systemach, które opierają się na różnych poziomach dostępu, możesz zdefiniować stałe, które będą reprezentować różne role użytkowników w twoim systemie. Dzięki temu, zmieniając jedną stałą, możesz zaktualizować swój kod bez konieczności przeszukiwania całej bazy.

  • Stałe ułatwiają organizację kodu.
  • Pomagają w zarządzaniu wartościami konfiguracyjnymi.
  • Zapewniają stabilność w obiektowym programowaniu.

W praktyce, stałe w klasach pomagają złagodzić chaos. Kiedy myślisz o nich jak o etykietach, które przypisujesz do różnych wartości, zaczynasz dostrzegać ich moc. W końcu, programowanie obiektowe to przecież sztuka organizacji i catwalk dla Twoich pomysłów. Im lepiej uporządkowany jest Twój kod, tym łatwiej możesz wprowadzić w nim zmiany.

Warto również wspomnieć, że stałe są stricte typowane, co oznacza, że muszą mieć przypisaną wartość jednego z dozwolonych typów danych już w momencie ich definicji. Spróbuj przemyśleć ten kontekst, a zauważysz, jak bardzo może to ułatwić życie. Stałe nie różnią się od innych elementów obiektowego programowania, ale ich unikalna niezmienność czyni je niezwykle potężnym narzędziem w arsenale każdego programisty PHP.

Wracając do naszej analogii z cegłami - jeśli dobrze zdefiniujesz swoje stałe, zbudujesz solidny mur, który obroniłby Cię przed chaotycznymi zmianami i błędami w kodzie. Dodając do tego odpowiednie wykorzystanie stałych i ich umiejętną organizację w klasach, masz szansę na stworzenie przejrzystej i łatwej do zrozumienia struktury projektowej. Ale co dalej? Zdradzimy Wam nieco tajników w kolejnym kroku i wprowadzimy do świata różnic między static a self. Tego na pewno nie chcesz przegapić!

Wiesz już, co oznaczają słowa kluczowe static oraz self w PHP, a także w jaki sposób można je wykorzystać w swoim kodzie. Dzisiaj przejdziemy do sedna sprawy, czyli omówimy kluczowe różnice między tymi dwoma terminami. Wyjątkowo ważne jest, abyś zrozumiał subtelności obu terminów, ponieważ niepoprawne ich użycie może prowadzić do nieprzewidzianych błędów i problemów w działaniu aplikacji.

Na początek warto przypomnieć, że static jest związane z właściwościami i metodami klas, które są wspólne dla wszystkich instancji tej klasy. W praktyce oznacza to, że gdy oznaczasz metodę lub właściwość jako static, do niej można odwołać się bez tworzenia instancji tej klasy. Może to przypominać odwołanie się do encyklopedii, gdzie masz dostęp do informacji bez potrzeby posiadania fizycznej książki w ręku. Z drugiej strony, self odnosi się do bieżącej klasy, a jego głównym celem jest odniesienie się do metod i właściwości, które są zdefiniowane w tej samej klasie, w której jest używane. Można to zobrazować analogią do odwoływania się do własnego zaproszenia na imprezę – chcesz zrozumieć, jaką rolę grasz w konkretnej sytuacji, nie zwracając uwagi na inne zaproszenia.

Metodę static możesz wywołać z dowolnego miejsca w kodzie, jak byłoby to w przypadku publicznej biblioteki z ogólnodostępnymi książkami. 

Przykładowo, gdy masz klasę Calculator z metodą statyczną add, możesz ją wywołać w ten sposób:


// Defining a static method
class Calculator {
    public static function add($a, $b) {
        return $a + $b;
    }
}

// Calling the static method without instantiating the class
$result = Calculator::add(5, 10); // Returns 15

W powyższym przykładzie, wywołując metodę add, nie musisz tworzyć instancji klasy Calculator. Po prostu korzystasz z metody, która jest dostępna na poziomie klasy. Natomiast self odnosi się do bieżącej klasy, a więc nie możesz go używać do odwołań spoza tej klasy. Jeśli wewnątrz naszej klasy chcielibyśmy wywołać pomocniczą metodę, używalibyśmy self::. Możemy na przykład stworzyć metodę, która informuje nas o wyniku dodawania:


// Inside the same Calculator class
public static function getResult($a, $b) {
    // Calling another static method from within the class
    return self::add($a, $b);
}

Tutaj widzimy, że korzystając z self, mamy pełną kontrolę nad tym, co się dzieje wewnątrz naszej klasy. Odwołując się do metody add, odwołujemy się do tego samego kontekstu, co zapewnia większą elastyczność i spójność kodu.

Inną istotną różnicą jest to, że static może być używane w kontekście dziedziczenia. Kiedy tworzysz podklasę, metody lub właściwości statyczne nie są nadpisywane i odnoszą się do oryginalnej klasy bazowej. Natomiast self odnosi się zawsze do klasy, w której był użyty, co oznacza, że twórz sobie swoje własne zasady. Przyjrzyjmy się zatem podklasie:


// Defining a child class
class AdvancedCalculator extends Calculator {
    public static function multiply($a, $b) {
        return $a * $b;
    }
}

Jeśli teraz wywołasz Calculator::add(), nadal odnosisz się do klasy Calculator, tak jakbyś korzystał z przekąski dostępnej w Twojej ulubionej kawiarni. Jednak wywołując AdvancedCalculator::multiply(), korzystasz już z nowej funkcjonalności, którą dostarcza podklasa. 

Dlatego static daje nam pewną formę elastyczności w kontekście dziedziczenia, podczas gdy self to ściśle i niezmiennie nasze miejsce w systemie. Zresztą, jak w każdej relacji, musimy się zastanowić, co najlepiej działa w konkretnej sytuacji, aby uniknąć zamieszania, które mogłoby wyniknąć z pomyłkowego użycia tych terminów.

Nie zapominajmy także o kontekście przestrzeni nazw, ponieważ to doda jeszcze kilka niuansów do naszej dyskusji. 

Zanim jednak zaczniemy zagłębiać się w te subtelności, zatrzymajmy się na chwilę przy tym, co już omówiliśmy. Czasami różnice między static a self mogą wydawać się drobne, ale jak pokazaliśmy, ich zrozumienie może wpłynąć na to, jak zbudujemy naszą aplikację – a w dłuższej perspektywie, na jej przyszłość. Sekret tkwi w szczegółach i zrozumieniu, kiedy i jak używać tych terminów w codziennej praktyce.

Przykłady kodu ilustrujące różnice między static a self w PHP

Przykłady są jak dobrze skrojony garnitur – pokazują, jak coś działa w praktyce i są niezwykle przydatne, by zrozumieć teoretyczne rozważania. Dziś zróbmy krok w stronę tego, co namacalne, a przy tym fascynujące. W PHP klasy potrafią być naprawdę złożone, ale dwa terminy, które warto mieć na uwadze, to static i self. Zrozumienie, jak używać tych dwóch skrótów, to klucz do mistrzowskiego poruszania się po świecie obiektów. Przygotujcie się na małą podróż przez kod!

Na początek, zobaczmy, jak działa static. Załóżmy, że mamy klasę o nazwie Counter, która zlicza, ile razy został utworzony jej obiekt. Co się stanie, gdy użyjemy static do przechowywania liczby instancji? Oto kod:


class Counter {
    // Static variable to track instance count
    private static $instanceCount = 0;
    public function __construct() {
        // Increment the static variable in the constructor
        self::$instanceCount++;
    }
    // Static method to get the count
    public static function getInstanceCount() {
        return self::$instanceCount;
    }
}
// Creating instances
$newCounter1 = new Counter();
$newCounter2 = new Counter();
// Displaying instance count
echo Counter::getInstanceCount(); // Output: 2

W powyższym przykładzie mamy zmienną statyczną $instanceCount, która jest wspólna dla wszystkich obiektów tej samej klasy. Niezależnie od tego, ile obiektów klasy Counter zostanie utworzonych, licznik działa jak centralny rejestr. Użycie self:: w kontekście metody getInstanceCount() odnosi się do tej samej zmiennej statycznej.

Teraz przenieśmy się do słowa kluczowego self. Self odwołuje się do bieżącej klasy, w której został wywołany, a nie do instancji czy klas nadrzędnych. Popatrzmy na poniższy kod:


class ParentClass {
    protected static $message = "Hello from ParentClass!";
    public static function displayMessage() {
        // Using self to access the static variable
        echo self::$message;
    }
}
class ChildClass extends ParentClass {
    protected static $message = "Hello from ChildClass!";
    public static function displayMessage() {
        // Accessing the parent message with parent::keyword
        echo parent::$message;
        // Access current class message with self::keyword
        echo self::$message;
    }
}
// Displaying messages
ParentClass::displayMessage(); // Output: Hello from ParentClass!
ChildClass::displayMessage(); // Output: Hello from ParentClass! Hello from ChildClass!

W tym przykładzie ChildClass dziedziczy po ParentClass. Zwróć uwagę, jak self odnosi się do $message w obrębie klas, podczas gdy słowo kluczowe parent pozwala nam wskazać, że chcemy sięgnąć po zmienną $message z klasy rodzica. To jak rodzinna kolacja, gdzie każdy członek rodziny ma swoją specjalność kulinarną, a mimo to wspólne tradycje wciąż pokutują.

A jak to wszystko podsumować?
Okazuje się, że static i self mają swoje unikalne zastosowania oraz różnice, które mogą wprowadzić nieco zamieszania, ale dokładne zrozumienie każdego z tych terminów oraz ich kontekstu pozwoli nam pisać bardziej elegancki i skuteczny kod w PHP.

Spis treści: