Wyjątki są liczniejsze od reguł. Od wszystkich uznanych wyjątków istnieją wyjątki.
PHP - typy danych

PHP obsługuje osiem typów prostych.

Cztery typy skalarne:

  • boolowski (boolean)
     
  • liczba całkowita (integer)
     
  • liczba zmiennoprzecinkowa (float)
     
  • łańcuch znaków (string)
     

Dwa typy złożone:

  • tablica (array)
     
  • obiekt (object)
     

Oraz dwa typy specjalne:

  • identyfikator zasobów (resource)
     
  • NULL (null)
     

Typ danych zwykle nie jest ustalany przez programistę. Robi to PHP na podstawie kontekstu, w jakim zmienna jest używana.

Aby sprawdzić typ i wartość konkretnego wyrażenia, należy użyć funkcji var_dump().

Aby mieć czytelną reprezentację typu dla potrzeb debugowania, należy użyć funkcji gettype().

Aby sprawdzić, czy zmienna jest jakiegoś konkretnego typu, nie używaj funkcji gettype(), tylko grupy funkcji is_jakiś_typ.

Aby narzucić konwersję zmiennej do określonego typu, można albo rzutować zmienną, albo użyć funkcji settype().

W pewnych sytuacjach zmienne mogą się zachowywać różnie, w zależności od tego, jakiego typu są w danej chwili.

 

Konwersja do typu boolowskiego

Aby jawnie skonwertować wartość na typ boolean, należy użyć rzutowania (bool) lub (boolean).
Jednakże w większości przypadków nie ma potrzeby użycia rzutowania, ponieważ wartość będzie automatycznie skonwertowana na typ boolean, jeśli operator, funkcja lub struktura kontrolna wymaga argumentu tego właśnie typu.

Przy konwersji na typ boolean, poniższe wartości otrzymują wartość logiczną FALSE:

  • boolowski FALSE
     
  • liczba całkowita 0 (zero)
     
  • liczba zmiennoprzecinkowa 0.0 (zero)
     
  • pusty łańcuch znaków, oraz łańcuch znaków "0"
     
  • tablica z zerową liczbą elementów
     
  • obiekt z zerową liczbą elementów
     
  • specjalny typ NULL (włączając niezadeklarowane zmienne)
     

Każda inna wartość otrzymuje logiczną wartość TRUE (włączając w to identyfikatory zasobów).

 

Konwersja na liczby całkowite

Do jawnej konwersji wartości na typ integer używa się operatora rzutowania (int) lub (integer). W większości przypadków jednak rzutowanie nie jest potrzebne, gdyż wartość zostanie skonwertowana automatycznie, o ile operator, funkcja lub struktura kontrolna wymaga argumentu typu integer.

  • Z boolowskiej: FALSE będzie miała wartość 0 (zero), a TRUE będzie miało wartość 1 (jeden).
     
  • Z liczb zmiennoprzecinkowych: liczba zostanie zaokrąglona w dół.
    Jeśli liczba zmiennoprzecinkowa jest poza zakresem liczb całkowitych, to wynik operacji rzutowania jest niezdefiniowany, ponieważ liczba zmiennoprzecinkowa nie ma odpowiedniej precyzji, aby zwrócić dokładną liczbę całkowitą. Nie pojawi się również żadne ostrzeżenie ani informacja odnośnie błędu!
     
  • Z łańcuchów znaków: zobacz łańcuchy znaków.
     
  • Z innych typów: wynik konwersji do liczb całkowitych z innych typów jest zawsze nieokreślony.
     

 

Łańcuchy znaków (string)

Typ string oznacza łańcuch znaków. W PHP znak jest tym sam co bajt, co oznacza, że jest możliwych 256 różnych znaków. PHP nie posiada żadnej wbudowanej obsługi Unikodu.

Nie ma też ustalonej maksymalnej długości łańcuchów znaków obsługiwanych w PHP, więc nie ma powodu do obaw, że dany łańcuch jest zbyt długi.

Łańcuch znaków można utworzyć na trzy sposoby:

  • Apostrof

    Najprostszym sposóbem na zdefiniowanie prostego łańcucha znaków, jest umieszczenie go w apostrofach (').

    Aby w takim łańcuch umieścić apostrof, należy go poprzedzić znakiem backslash (\), tak jak w wielu innych językach programowania. Jeśli ubackslash ma wystąpić przed apostrofem lub na końcu łańcucha, wtedy należy napisać go dwukrotnie.

    W przypadku użycia backslasha z innym znakiem, backslash też zostanie wyświetlony! Nie ma zatem potrzeby pisania ukośnika dwukrotnie w innych sytuacjach.

    Uwaga: W przeciwieństwie do dwóch pozostałych składni, zmienne nie będą zamienione na swoje wartości, kiedy pojawią się pomiędzy apostrofami.
     
  • Podwójne cudzysłowy

    Jeżeli łańcuch znaków jest umieszczony pomiędzy podwójnymi cudzysłowami, to PHP interpretuje więcej sekwencji cytowania dla znaków specjalnych:

    Sekwencja Znaczenie
    \n nowa linia (LF lub 0x0A (10) w ASCII)
    \r powrót karetki (CR lub 0x0D (13) w ASCII)
    \t tabulacja pozioma (HT lub 0x09 (9) w ASCII)
    \\ odwrotny ukośnik
    \$ znak dolara
    \" cudzysłów podwójny
    \[0-7]{1,3} sekwencja znaków pasująca do powyższego wyrażenia regularnego daje znak zapisany w notacji ósemkowej
    \x[0-9A-Fa-f]{1,2} sekwencja znaków pasująca do powyższego wyrażenia regularnego daje znak zapisany w notacji szesnastkowej
    Tak jak w poprzedniej składni, zapisanie ukośnika wstecznego przed każdym innymi znakiem spowoduje wyświetlenie zarówno ukośnika, jak i znaku.

    Najważniejszą właściwością podwójnych cudzysłowów jest to, że zapisane w nich zmienne zostaną zamienione na ich wartości.
     
  • Składnia Heredoc

    Jeszcze jednym sposobem na zapisanie łańcucha znaków jest użycie skladni heredoc ("<<<").

    Po operatorze <<< powinno się umieścić identyfikator i takim samym identyfikatorem trzeba zakończyć łańcuch znaków.

    Identyfikator zamykający musi zaczynać się w pierwszej kolumnie nowej linii. Identyfikator musi też podlegać regułom nazewnictwa w PHP: musi się składać wyłącznie z alfanumerycznych znaków oraz znaku podkreślenia i musi zaczynać się od litery lub znaku podkreślenia.

    Należy pamiętać, że linia zawierająca identyfikator zamykający nie może zawierać żadnych innych znaków, z wyjątkiem średnika. Oznacza to, że identyfikator zamykający nie może być wcinany i nie może być żadnych spacji ani tabulacji przed lub za średnikiem.

    Przykład:
        <?php
        $tab 
    = array(123);
        
    $name 'Jan Kowalski';

        echo &
    lt;&lt;&lt;EOT
        Nazywam się 
    "$name".
        
    Drugi element tablicy jest równy $tab[1].
        
    Po dwukropku powinien pojawić się znak 'A': \x41
        EOT
    ;
        
    ?>

     

Łańcuchy znaków łączy się za pomocą operatora '.' (kropka). Operator dodawania '+' nie wykonuje operacji łączenia łańcuchów.

Konwersja łańcuchów znaków

Jeśli łańcuch znaków jest konwertowany na postać liczbową zostanie skonwertowany do typu float, jeśli zawiera znaki ".", "e" lub "E". W przeciwnym razie zostanie skonwertowany do typu integer.

Wartość liczbowa łańcucha znaków zależy od pierwszych znaków tego łańcucha. Jeśli łańcuch zaczyna się od poprawnej wartości liczbowej, wartość ta będzie używa przy konwersji. W przeciwnym razie zwrócona będzie wartość 0 (zero). Poprawna wartość liczbowa zaczyna się od opcjonalnego znaku, po którym znajduje się jedna, lub kilka cyfr (opcjonalnie kropka dziesiętna), po którym opcjonalnie znajduje się eksponent. Eksponent jest to znak "e" lub "E", po którym następuje jedna, lub więcej cyfr.

Kiedy pierwszym wyrażeniem jest łańcuch znaków, typ zmiennej będzie zależał od drugiego wyrażenia. Np.:

    $x = 1 + "10.5";                // $x jest typu float (11.5)
    $x = 1 + "-1.3e3";              // $x jest typu float (-1299)
    $x = 1 + "bob-1.3e3";           // $x jest typu integer (1)
    $x = 1 + "bob3";                // $x jest typu integer (1)
    $x = 1 + "10 małych świnek";    // $x jest typu integer (11)
    $x = 1 + "10 malutkich świnek"; // $x jest typu integer (11)
    $x = "10.0 świnek " + 1;        // $x jest typu integer (11)
    $x = "10.0 świnek " + 1.0;      // $x jest typu float (11)

 

Tablice (array)

Tablica w PHP jest obecnie uporządkowaną mapą. Mapa jest typem, który przyporządkowuje wartości do kluczy. Typ ten jest optymalizowany na wiele sposobów, więc można go używać jako typową tablicę, listę (wektorową), tablicę asocjacyjną (która jest jedną z implementacji mapy), słownik, kolekcję, stos, kolejkę, i temu podobne. Ponieważ wartością tablicy może być inna tablica PHP, można także łatwo symulować drzewa.

Tablicę można utworzyć za pomocą funkcji array(). Jej argumentami są rozdzielone przecinkiem pary klucz => wartość.

kluczem może być albo nieujemną liczbą całkowitą, albo łańcuchem znaków. Jeśli klucz jest nieujemną liczbą całkowitą, to zostanie zinterpretowany tak, jak jest (tzn. '8' będzie zinterpretowane jako 8, podczas gdy '08' będzie zinterpretowane jako '08').

Wartością może być cokolwiek.

Jeśli pominiesz klucz, to jako klucz zostanie użyty najwyższy indeks całkowity + 1.
Jeśli nie ma w ogóle indeksu całkowitego, to klucz będzie miał wartość 0 (zero).
Jeśli użyjesz klucza, do którego już wcześniej została przypisana wartość, to wartość ta zostanie nadpisana.

Typ tablicowy w PHP jest bardzo różnorodny, co prezentują poniższe przykłady.


    <?php
    
// to:
    
$a = array( 'kolor'   => 'czerowny'
              
'smak'    => 'słodki'
              
'kształt' => 'okrągły'
              
'nazwa'   => 'jabłko'
              
4        // kluczem będzie 0
              
);

    
// znaczy dokładnie to samo, co to:
    
$a['kolor']   = 'czerwony';
    
$a['smak']    = 'słodki';
    
$a['kształt'] = 'okrągły';
    
$a['nazwa']   = 'jabłko';
    
$a[]          = 4;        // kluczem będzie 0


    // a to:
    
$b[] = 'a';
    
$b[] = 'b';
    
$b[] = 'c';

    
// znaczy to samo co:
    
$b = array( => 'a' => 'b' => 'c' );

    
// albo prościej:
    
$b = array('a''b''c');

 

Zwalnianie zasobów

Zasobów (resource) jest specjalną zmienną, przechowywującą odnośnik do zewnętrznego źródła zasobów. Identyfikatory zasobów są tworzone i wykorzystywane przez specjalne funkcje.

Dzięki systemowi kontroli zasobów automatycznie wykrywana jest sytuacja, kiedy nie ma już odnośników do zasobu (tak jak w Javie). W takie sytuacji zasoby systemowe używane do tego zasobu zostają zwolnione przez destruktor zasobów. Dlatego nie jest konieczne, aby zwalniać pamięć ręcznie za pomocą funkcji typu free_result.

Wyjątkiem są stałe połączenia z serwerami baz danych, które nie są niszczone przez destruktor zasobów.

 

Typ NULL (null)

Specjalna wartość NULL oznacza, że zmienna nie przechowuje żadnej wartości. NULL jest jedyną możliwą wartością typu NULL.

Wielkość liter słowa NULL nie ma znaczenia.

« wstecz   dalej »