PHP 8.2 - sprawdź co nowego!

Programowanie obiektowe > Lekcja 4

Metody i właściwości statyczne

W niektórych sytuacjach tworzenie obiektu może być bezcelowe, jednak chcielibyśmy nadal użyć klas. Z pomocą przychodzą nam tutaj właściwości lub metody statyczne, do których możemy się odwołać bez tworzenia obiektu. Warto powiedzieć, że zdecydowanie nie zaleca się ich zbyt częstego stosowania. W końcu po to mamy myśleć obiektowo i tworzyć obiekty, aby operować na nich. Jednak czasem może to być przydatne, dlatego omówimy sobie ten temat.

Aby dana właściwość/metoda była statyczna, wystarczy jeden prosty zabieg - dodanie w deklaracji słowa static. Teoretycznie możemy to zrobić za modyfikatorem dostępu lub przed, ale standard PSR-12 mówi, iż należy robić to za modyfikatorem dostępu. Tego więc będę się trzymał.

W praktyce wygląda to na przykład tak:

<?php

class Operation
{
    public static int $number1 = 5;

    public static function addition(int $number2, int $number3): int
    {
        return $number2 + $number3;
    }
}

Dostęp do statycznej właściwości/metody uzyskujemy poprzez :: (dwa znaki dwukropka). Nie tworzymy obiektu (bo przecież nie o to nam chodzi), dlatego nie używamy new. Nie działa tutaj również ->, który jest operatorem tylko do obiektów, a tutaj mamy samą klasę.

<?php

class Operation
{
    public static int $number1 = 5;

    public static function addition(int $number2, int $number3): int
    {
        return $number2 + $number3;
    }
}

echo Operation::$number1; // result 5
echo Operation::addition(4, 2); // result 6

Podobnie nie mamy tutaj $this, gdyż również używane może być to tylko na obiektach. W celu odwołania się do tej samej klasy należy skorzystać z self.

<?php

class Operation
{
    private static int $number1 = 5;

    public static function addition(int $number2): int
    {
        return self::$number1 + $number2;
    }
}

echo Operation::addition(2); // result 7

Zarówno użycie -> lub $this na właściwości czy metodzie statycznej spowoduje wygenerowanie odpowiedniego błędu. W końcu, gdy nie mamy obiektu ciężko coś na nim zrobić ;)

Uwaga

Właściwość statyczna nie może jednocześnie być zadeklarowana jako readonly. Podobnie nie można nadać tej deklaracji całej klasie, jeśli jakakolwiek z jej właściwości jest statyczna.

Stałe

Jak być może jeszcze pamiętasz, przy podstawach języka, w lekcji o zmiennych i stałych rzuciłem coś o różnicy między define a const. Skoro mamy już omówione działanie na klasie bez obiektu, przyszedł dobry moment, aby wrócić do tego tematu. Otóż w klasie możemy również definiować stałe. Aby to zrobić, używamy const w taki sposób:

<?php

class Operation
{
    private const NUMBER_1 = 5;

    public static function addition(int $number2): int
    {
        return self::NUMBER_1 + $number2;
    }
}

echo Operation::addition(2); // result 7
echo Operation::NUMBER_1; // result: fatal error

Dostać się do takiej wartości możemy również przez self lub nazwę klasy. Zasada działania identyczna - nie da się zmienić takich wartości. Podobnie wygląda kwestia nazw, zwyczajowo zapisuje się je wielkimi literami. Stałe nie mają określonego typu. Za to możemy, a wg PSR-12 nawet musimy, określić modyfikator widoczności, który zachowuje się tak samo, jak przy zwykłych właściwościach.

Uwaga

Do stałych nie możemy odwołać się przy użyciu ->, nawet jeśli robimy to w kontekście obiektu.

Ogólnie rzecz biorąc, statyczne elementy klasy czasem mogą być przydatne, ale nie powinny być nadużywane. Przemyśl, czy na pewno tworząc coś statycznego, musi ono takie być - może warto zaprojektować dany fragment aplikacji inaczej?

Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter

Komentarze