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