Deklarowanie struktur tablicowych w PHP
Niestety, nie jest możliwe zdefiniowanie jawnych typów tablic, tak jak robią to inne języki programowania, takie jak Java:
List<User> users = new ArrayList<>();
Mamy nadzieję, że niektóre narzędzia, takie jak PHPStan lub Psalm, pomagają nam analizować kod statycznie, co oznacza, że nie wykonują, ale sprawdzają kod pod kątem niespójności na podstawie komentarzy PHP.
Istnieją 3 różne sposoby definiowania typu elementów w tablicy PHP:
- Tradycyjny sposób:
User[] - Kształt listy:
array<int,mixed>&list<mixed> - Kształt obiektu:
array{0:int, foo:?string, bar:mixed}
Jest to modny sposób definiowania listy elementów z określonego typu, problem polega na tym, że staje się ona niejednoznaczna , a klienci korzystający z tego rodzaju listy nie mogą wiedzieć, czy klucze są liczbami całkowitymi, zmiennoprzecinkowymi czy łańcuchami.
Ponadto analizatory statyczne nie zawiodą, jeśli spróbujesz uzyskać element po kluczu o niepoprawnym typie, w tych scenariuszach sugerowałbym użycie array<int,mixed>.
W końcu im wyraźniej, tym lepiej.
/** @var User[] $users */
$users = [ ... ];
# Are keys autoincremental integers, random numbers, maybe strings... ?
$firstUser = $users[ ? ];
# Static analyzers won't complain if you use an incorrect type
Używamy list, gdy mamy tablicę elementów tego samego typu.
Aby to zrobić, używamy składni rombu , aby zadeklarować typy klucza i wartość: array<int,mixed>. Istnieje bardzo przydatny skrót, gdy klucz jest liczbą całkowitą z automatycznym przyrostem: list<mixed>.
/** @var array<string,User> $users */
$users = [
'jesus' => new User('Jesus Valera'),
'chema' => new User('Chema Valera'),
];
$userJesus = $users['jesus'];
$userChema = $users['chema'];
$users[0]; # ERROR: "Offset 0 does not exist on array<string, User>"
---
/** @var list<User> $users */
$users = [ ... ];
$firstUser = reset($users);
$lastUser = end($users);
Używamy kształtu obiektu, gdy tablica nie jest zbiorem obiektów, ale mapą zawierającą informacje.
Aby to zrobić, używamy składni nawiasów klamrowych i definiujemy nazwę klucza oraz typ, możemy podzielić przecinkami, jeśli istnieje wiele elementów: .array{foo:int, bar:string}
/** @var array{id:int, birthdate: DateTimeImmutable} */
$additionalInfo = [ ... ];
$id = $additionalInfo['id']; # int
$birthdate = $additionalInfo['birthdate']; # DateTimeImmutable
final class User
{
/** @var list<Comment> */
public readonly array $comments;
/** @var array{id:int, birthdate: DateTimeImmutable} */
public readonly array $additionalInfo;
}
Oczywiście możliwe jest przedstawienie dowolnej złożonej struktury tablicowej w PHP za pomocą tych komentarzy PHP. Przykład:
/**
* @var list<
* array{
* uuid?: string,
* content: array{name: string, foo: ?stdClass},
* }
* > $array
*/
$array = [
0 => [
'uuid' => 'XXXX-XXX-XXX-XXXX',
'content' => [
'name' => 'str',
'foo' => null,
],
],
1 => [
'content' => [
'name' => 'str',
'foo' => new stdClass(),
],
],
// ...
];
Zasoby:
- Psalm | Kształty tablic
- PHPStan | Typy PHPDoc

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































