W PHP nie ma tablic typowanych – powie każda osoba, która pracowała z tym językiem przez przynajmniej kilka miesięcy. Ale jest za to pewna ciekawostka, o której nie każdy wie, a może być w pewnych sytuacjach bardzo przydatna.
W języku PHP – ale nie tylko w nim – mamy operator reszty (ang. spread operator). Używamy go w deklaracji metod lub funkcji aby powiedzieć, że metoda przyjmuje bliżej niezidentyfikowaną liczbę argumentów. W PHP możemy użyć tego operatora wraz z typowaniem, np.
<?php
declare(strict_types=1);
function sum(int ... $numbers): int
{
return array_sum($numbers);
}
echo sum(1,2,3);
Dzięki temu zabiegowi, jeżeli podamy argumenty o innym niż przewidzianym typie, otrzymamy błąd typowania.
Gdzie takie rozwiązanie może się przydać? Np. gdy tworzymy samodzielnie kolekcje. Stwórzmy klasę tworzącą prosty stos:
<?php
declare(strict_types=1);
class StackCollection {
public function __construct(int ... $numbers)
{
$this->numbers = $numbers;
}
public function push(int $number): self
{
$this->numbers[] = $number;
}
public function pop(int $number): int
{
return array_pop($this->numbers);
}
}
Dzięki wykorzystaniu wyżej opisanej sztuczki możemy zainicjować stos z dowolną liczbą danych wejściowych, gdzie każda z nich będzie tego samego typu.
Tablice indeksowane o stałej długości
Zwykle tworząc tablicę w PHP mamy na myśli konstrukcję stworzoną za pomocą operatora []. Takie tablice mają tę właściwość, że są bardzo elastyczne - możemy zmieniać ich długość i odwoływać się do elementów w dwojaki sposób: za pomocą indeksów numerycznych lub kluczy będących literałami.
W niektórych przypadkach ta dowolność może powodować problemy. Na szczęście w PHP dostępna jest dodatkowa implementacja tablicy: SplFixedArray.
Tak zainicjowana tablica ma stałą szerokość oraz wyłącznie indeksy numeryczne. Może to się przydać np. w obliczeniach numerycznych, gdzie obliczenia wykonuje się na macierzach. Przy próbie zmiany rozmiaru macierzy otrzymamy błąd w stylu:
Fatal error: Uncaught RuntimeException: Index invalid or out of range in ...
Powyższa implementacja ma także dodatkową wartość, która jest opisana na stronie powyżej. Jest szybsza, niż powszechnie stosowana implementacja, z której korzystamy na co dzień. Dlatego - jeżeli powyższe ograniczenia nie przeszkadzają w przypadku twojego kodu, warto stosować ten zamiennik.
Komentarze
Ten wpis nie posiada komentarzy.
Dodaj komentarz
Pola oznaczone gwiazdką (*) są wymagane. Komentarze są wstępnie moderowane i mogą nie pojawić się na stronie.