Jdi na navigaci předmětu

Datové typy a výrazy

Přetypování

  • Implicitní - PHP převede hodnotu samo podle operátoru nebo kontextu

    $a = "5";
    $a = $a + 5;    // 10 (integer)
    echo $a . "!";  // "10!" (string)
  • Explicitní - operátory (bool), (int), (float), (string), (array), (object), případně funkce intval(), floatval(), strval(), boolval()

    $numstr = "5";
    $number = (int) $numstr;
    $number = intval($numstr);
  • Pravidla převodu pro jednotlivé typy viz níže, úplný přehled v referenční dokumentaci

Pravdivostní hodnoty

  • TRUE, FALSE
  • case insensitive
  • explicitní konverze
    • (bool) (boolean)
  • implicitní konverze
    • 0, 0.0, "", "0", [], null → FALSE
    • vše ostatní → TRUE

Celá čísla (integer)

  • se znaménkem, 32- or 64-bit, znaménko (+ nebo -)
  • base 16 (0xA), 10 (10), 8 (012), 2 (0b1010)
  • PHP_INT_SIZE, PHP_INT_MAX, PHP_INT_MIN (PHP 7.0)
  • při overflow automaticky konverze na float

Čísla s plovoucí desetinou čárkou (float)

  • podle normy IEEE 754, mantisa + exponent
  • ztráta přesnosti
  • nevhodné přímo porovnávat rovnost

Práce s čísly - konverze

  • konverze na integer
  • konverze na float
  • NaN - not a number
    • výsledek některých výpočtů
    • sqrt(-1) → NAN
  • Math, BCMath

Práce s čísly

  • ztráta přesnosti!

    floor((0.1+0.7)*10);    // 7
    intval(19.99*100)       // 1998
  • porovnání desetinných čísel, pomocí == nevhodné

    $a = 1.23456789; $b = 1.23456780;
    // presnost
    $epsilon = 0.00001;
    if (abs($a-$b) < $epsilon) ...

Řetězce

  • single quoted, nowdoc - proměnné se nenahrazují, jediné escape sekvence jsou \' a \\

    $string = 'single quoted - symbol \', escape \\';
    $string = '$string';
    $string = <<<'END'
    Variables are not expanded in nowdoc, try it:
    $string = $string;
    END;
  • double quoted, heredoc - proměnné se nahrazují, lze použít escape sekvence (\n, \t, \$, …​)

    $string = "$string"; //empty string
    $string = <<<END
    Variables are expanded in heredoc, try it:
    \$string = $string;
    Lze odřádkovat, používat " a '.
    END;

Práce s řetězci - parsování proměnných

  • jednoduchá syntaxe - "$variable"
  • komplexní syntaxe - "{$variable}"
    • umožňuje složitější výrazy např. volání funkcí
$numbers = [1 => 1, 2, 3];
echo "$numbers[2]";

function f() {
    return 'colors';
}

$colors = ['blue' => 0x0000FF, 'green' => 0x00FF00, 'red' => 0xFF0000];
// nepřehledný kód - to, že něco _jde_ ještě nutně neznamená, že je to dobrý nápad
echo "{${f()}['green']}"; // vypíše 0x0000FF

Práce s řetězci - přístup po znacích

  • [index] - nefunguje s multibyte řetězci!

    $string = 'abcde';
    echo "{$string[0]}"; // => a
  • mb_substr()

viz také: substr(), substr_replace(),

Práce s řetězci - interní reprezentace

  • pole bytů, vnitřně kódováno v ISO-8859-1 (Latin1)
  • některé funkce nefungují s multibyte řetězci! - např. strlen(), strpos()
  • rozšíření pro multibyte - mbstring, obvykle vestavěné

viz Details of string type

Práce s řetězci - porovnání

  • == převádí číselné řetězce na čísla, tzn. "1e1" == "10" je TRUE
    • pro porovnání obsahu použijte ===
  • strcmp($str1, $str2), binárně bezpečná
    • 0 - rovnost, kladné číslo - $str1 > $str2, záporné číslo - $str1 < $str2
    • stejný princip jako operátor <=>
  • varianty: strcasecmp() (bez ohledu na velikost písmen), strnatcmp() (přirozené řazení, "img2" < "img10")

Práce s řetězci - konverze

Pole

  • uspořádaná mapa - klíč ⇒ hodnota
  • klíčem je integer nebo string, hodnotou cokoli (i další pole)
  • automatické indexy (klíče) od 0 nebo jako asociativní pole
  • použití
    • vektor
    • hash tabulka, slovník
    • vícerozměrné pole (pole polí)

Pole - literál

$array = [
    "foo" => "bar",
    42    => 24,
    "multi" => [
         "dimensional" => [
             "array" => "foo"
         ]
    ]
];

původní syntaxe array( …​ ), od PHP 7 pohodlnější [ …​ ]

Automatický index pokračuje za nejvyšším dosud použitým celočíselným klíčem:

$arr = [5, 13 => 9, 8, "a" => 42];
echo $arr[0];    // 5
echo $arr[13];   // 9
echo $arr[14];   // 8
echo $arr["a"];  // 42

Práce s polem - základní operace

  • přidání prvku
    • na konkrétní místo - $a[10] = …​
    • na konec pole - $a[] = …​
  • test existence - isset($a[10])
  • odstranění prvku - unset($a[10])

Práce s polem

  • konverze na pole - explicitně (array)
  • porovnání
  • přiřazení (kopírování)
    • hodnotou - $b = $a;
    • referencí (explicitně) - $b = &$a;

Práce s polem

  • Array functions
    • iterování - current, next, end, reset
    • test existence hodnoty - in_array
    • test existence klíče - array_key_exists
    • řazení - sort, asort, ksort …​
    • sloučení/rozdělení - array_merge, array_merge_recursive, array_slice
    • fronta/zásobník - array_push, array_pop, array_shift, array_unshift
    • mapování - array_map, filtrování - array_filter
    • …​