Podręcznik PHP
Poprzedni | Rozdział 11. Typy danych | Następny

# Wykorzystywanie typów danych

PHP nie wymaga (a nawet nie obsługuje) jawnej deklaracji typów zmiennych. Typ zmiennej jest określany na podstawie kontekstu, w jakim ta zmienna jest używana. Oznacza to m.in., że przy przypisaniu łańcucha znaków do zmiennej var, zmienna ta zmienia swój typ na string. Jeśli potem zostanie przypisana wartość całkowita, var zmienia swój typ na integer.

Przykładem automatyczniej konwersji typów jest operator dodawania '+'. Jeśli którykolwiek z operandów jest typu float, to wszystkie operandy zostaną potraktowane jako liczby float i taki też typ będzie zwrócony jako wynik dodawania. W przeciwnym razie operandy zostaną potraktowane jako liczby całkowite i wynikiem także będzie liczba całkowita. Proszę jednak zwrócić uwagę, że działanie to NIE zmienia typów samych operandów; zmienia jedynie sposób ich interpretacji przez operator dodawania.

`$foo = "0"; // $foo jest łańcuchem znaków (ASCII 48) $foo += 2; // $foo jest liczbą całkowitą (2) $foo = $foo + 1.3; // $foo jest liczbą zmiennoprzecinkową (3.3) $foo = 5 + "10 Małych świnek"; // $foo jest liczbą całkowitą (15) $foo = 5 + "10 Większych świnek"; // $foo jest liczbą całkowitą (15)`

Jeśli dwa ostanie przykłady wydają się tobie dziwne, zajrzyj do rozdziału Konwersja łańcuchów znaków.

Jeśli chcesz skonwertować zmienną z jednego typu do innego, użyj rzutowania typów. Aby zmienić typ zmiennej, użyj settype().

Jeśli chcesz przetestować którykolwiek z przykładów z tego rozdziału, możesz użyć funkcji var_dump().

> Notatka: Efekty automatycznej konwersji do tablicy są aktualnie nieokreślone.

> `$a = 1; // $a jest liczbą całkowitą $a[0] = "f"; // $a staje się tablicą, $a[0] zawiera "f"`

> W powyższym przykładzie wydawać się może oczywiste, że $a stanie się tablicą z pierwszym elementem "f"; rozważ jednak poniższy przykład:

> `$a = "1"; // $a jest łańcuchem znaków $a[0] = "f"; // Co z ofsetami łańcuchów? Co się dzieje?`

> Ponieważ PHP obsługuje indeksowanie łańcuchów za pomocą ofsetów, używając tej samej składni co indeksowanie tablic, powyższy przykład powoduje problem: czy $a powinno zostać tablicą z pierwszym elementem o wartości "f", czy raczej "f" powinno zostać pierwszym znakiem łańcucha $a?

> Z tego właśnie powodu, od PHP 3.0.12 i PHP 4.0b3-RC4, efekt automatycznej konwersji pozostaje nieokreślony. Dyskusje odnośnie tego problemu trwają.

## Rzutowanie typów

Rzutowanie typów w PHP działa mniej więcej tak jak w języku C: nazwa docelowego typu umieszczana jest w nawiasach przed nazwą zmiennej, która ma być zrzutowana.

`$foo = 10; // $foo jest liczbą całkowitą $bar = (float) $foo; // $bar jest typu float (zmiennoprzecinkowego)`

Operatory rzutowania są następujące:

- (int), (integer) - rzutowanie do liczb całkowitych

- (bool), (boolean) - rzutowanie do typu boolowskiego

- (float), (double), (real) - rzutowanie do liczb zmiennoprzecinkowych

- (string) - rzutowanie do łańcucha znaków

- (array) - rzutowanie do tablicy

- (object) - rzutowanie do obiektu

> Notatka: Zamiast rzutować zmienną do łańcucha znaków operatorem, można też umieścić zmienną w cudzysłowie podwójnym.

Wewnątrz nawiasów operatora rzutowania mogą znajdować się tabulacje i spacje, więc poniższe przykłady są funkcjonalnie identyczne:

`$foo = (int) $bar; $foo = ( int ) $bar;`

Efekt rzutowania pomiędzy niektórymi typami nie zawsze daje spodziewany wynik. Więcej informacji o skutkach rzutowania w rozdziałach:

- Konwersja do typu boolowskiego

- Konwersja do liczb całkowitych

Przy rzutowaniu lub wymuszeniu konwersji z tablicy do łańcucha znaków, rezultatem będzie słowo Array. Przy rzutowaniu lub wymuszeniu konwersji z obiektu do łańcucha znaków, rezultatem będzie słowo Object.

Przy rzutowaniu ze zmiennej skalarnej lub łańcucha do tablicy, wartość zmiennej stanie się pierwszym elementem tablicy:

`$var = 'ciao'; $arr = (array) $var; echo $arr[0]; // wynik: 'ciao'`

Przy rzutowaniu ze zmiennej skalarnej lub łańcucha do obiektu, wartość zmiennej stanie się właściwością obiektu; właściwość ta będzie nazywać się 'scalar':

`$var = 'ciao'; $obj = (object) $var; echo $obj->scalar; // wynik: 'ciao'`

Poprzedni | Spis treści | Następny
Typ NULL (null) | Początek rozdziału | Zmienne