Kontynuujemy poznawanie języka PHP. Tym razem skupimy się na temacie, jakim są różne typy zmiennych, sprawdzanie ich a także konwertowanie z jednego typu na drugi.

Sprawdzanie typu zmiennej/wartości

Do sprawdzenia, czy mamy do czynienia z napisem służy funkcja is_string:

<?php
$msg = "hello";
$num = 123;
if(is_string($msg)){
    echo "msg is string</br>";
}
if(!is_string($num))
{
    echo "num is not a string";
}
// msg is string
// num is not a string

Analogicznie, do sprawdzania, czy typ jest liczbą bez wartości po przecinku służy funkcja is_int, zaś do sprawdzania, czy typ jest liczbą z wartościami po przecinku, służy funkcja is_float:

$msg = "hello";
$num = 123;
if(is_int($num))
    echo "Num is int</br>";
if(!is_float($num))
    echo "num is not a float</br>";

// Num is int
// num is not a float

Funkcja is_float posiada swój alias is_double, który działa dokładnie tak samo.

Do sprawdzania, czy dany typ jest typem prostym/skalarnym (czyli takim, który może być kluczem w tablicy asocjacyjnej, typem prostym czyli napisem bądź liczbą) służy funkcja is_scalar:

<?php
$msg = "hello";
$num = 123;
$arr = ['John', "Jim", "Jane"];
$arr_assoc = [
    'name' => 'John',
    'age' => 30
];
if(is_scalar($msg) && is_scalar($num))
    echo "msg and num are scalar </br>";
if(!is_scalar($arr) && !is_scalar($arr_assoc))
    echo "arr and arr_assoc are not scalar";

// msg and num are scalar
// arr and arr_assoc are not scalar

Przy okazji poznajemy coraz bardziej zaawansowane bloki warunkowe – && oznacza „i”, „!” oznacza „nie”.

W drugim bloku mamy warunek „jeżeli nie jest skalarny arr oraz nie nie jest skalarny arr_assoc”.

Ciekawą funkcją jest is_numeric, które sprawdza, czy dana wartość jest liczbą albo tekstem, który można do liczby konwertować:

<?php
$msg = "123";
$num = 123;

if(is_numeric($msg) && is_numeric($num))
    echo "msg and num are numeric";
// msg and num are numeric

Takich funkcji jest jeszcze w PHP trochę, np. is_array sprawdza, czy dany typ jest tablicą, is_object – obiektem (dopiero je poznamy), funkcje te są proste i mają nazwy pozwalające wydedukować czemu służą.

Rzutowanie do typu wartości

Rzutowanie to bardzo prosty proces. Polega na zmianie typu zmiennej na inny typ. Oto przykład rzutowania, czyli zmieniania typu, z typu string na int:

<?php
$msg = "123";
$num = (int) $msg;
if(is_int($num))
    echo $num;
//123

Rzutować do typu int możemy też z typu float (liczba z wartościami po przecinku), oczywiście liczymy się z utratą tych wartości, dla których w int nie ma miejsca:

<?php
$num_float = 12.55;
$num_int = (int) $num_float;
echo $num_int;
//12

Podobnie może być w przypadku rzutowania napisu do int, oto przykład:

<?php
$font_size = "16px";
$font_size_int = (int) $font_size;
echo $font_size_int;
//16

Liczba to liczba i takich wartości jak „px”, które oznaczają tutaj jednostkę miary, mieć nie może.

Myślę, że jedynym ciekawym typem rzutowania jest rzutowanie z tablicy (asocjacyjnej) do obiektu.

Jeszcze nie poznaliśmy czym są obiekty i klasy, ale już teraz możemy sobie zobaczyć jak, bez znajomości klas, możemy utworzyć sobie obiekt, rzutując do typu object tablicę asocjacyjną:

<?php
$arr_assoc = [
    "name" => "John",
    "age" => 30
];
$person = (object) $arr_assoc;
echo "His name is $person->name </br>";
echo "His age is $person->age";
// His name is John
// His age is 30

Zmienna person staje się obiektem utworzonym na podstawie arr_assoc. Klucze stają się polami tego obiektu, wartości – wartościami tych pól.

Do pól obiektu odnosimy się używając notacji obiekt->nazwa_pola, co widzimy powyżej.

Zaokrąglanie wartości liczbowych

Wartości liczbowe możemy zaokrąglać przy pomocy funkcji round:

<?php
var_dump(round(3.4));
var_dump(round(3.5));
var_dump(round(3.6));
//float(3) float(4) float(4)

Warto zauważyć, że round zaokrągla liczbę, nie zmienia jej typu. Dostajemy nadal float, czyli typ zmiennoprzecinkowy.

Użyłem funkcji var_dump, która wyświetla typ zmiennej/wartości oraz samą wartość – bywa przydatne w degubowaniu.

Funkcja round może też przyjąć jako argument liczbę miejsc po przecinku, do których mamy liczbę zaokrąglić:

<?php
var_dump(round(3.456, 2));
var_dump(round(3.54325, 4));
var_dump(round(3.65, 0));
//float(3.46) float(3.5433) float(4)

Zero oznacza 0 miejsc po przecinku i jest to wartość domyślna, nie musimy jej podawać jako drugi argument, jeżeli chcemy zaokrąglić liczbę do postaci bez miejsc po przecinku.

W innym wypadku – podajemy, ile miejsc po przecinku chcemy uzyskać.

Do zaokrąglania mamy też dwie prostsze funkcje. Jedna z nich, to floor – zaokrągla do wartości bez przecinka, zawsze zaokrąglając „w dół”, niezależnie od wszystkiego:

<?php
echo floor(4.3);   // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4
?>

Funkcja ceil działa podobnie, zaokrągla do wartości po przecinku, ale zawsze zaokrągla „w górę”, niezależnie od wszystkiego:

<?php
echo ceil(4.3);    // 5
echo ceil(9.999);  // 10
echo ceil(-3.14);  // -3
?>

Są to bardzo proste funkcje. Funkcja round zaokrągla „jak należy”, czasami w dół, czasami do góry, zgodnie z zasadami matematyki. Ponadto round pozwala określić, ile miejsc po przecinku uzyskać chcemy, więc wydaje się lepsza od floor i ceil, ale warto te funkcje również znać.

Inną funkcją, którą warto poznać jest abs. Skrót od absolute value (wartość bezwzględna) – funkcja ta zamienia liczby ujemne na dodatnie (a w przypadku nieujemnych nic z nimi nie robi):

<?php
echo abs(-3) . "</br>";
echo abs(0) . "</br>";
echo abs(3) . "</br>";
// 3
// 0
// 3

Liczba do litery, litera do liczby

Dla komputerów nie ma czegoś takiego jak litery czy inne znaki. Każdy znak znajdujący się na naszej klawiaturze posiada odpowiadającą mu liczbę.

Liczbę można zamienić na literę poprzez funkcję chr.

<?php
echo chr(65);
//A

Liczba 65 odpowiada wielkiej literze A.

Możemy też dokonać odwrotnego procesu. Funkcja ord przyjmuje literę i zwraca liczbę, która jej odpowiada:

<?php
echo ord("A");
//65

Jeżeli podamy tej funkcji więcej niż jedną literę, funkcja nadal da nam liczbę, która odpowiada pierwszej literze, reszta zostanie zignorowana:

echo ord("Abcdef");
//65