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.