Programowanie obiektowe > Lekcja 4
Metody i właściwości statyczne
Ostatnia modyfikacja: 07.10.2023
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?
Komentarze