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ě funkceintval(),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
Práce s čísly
ztráta přesnosti!
floor((0.1+0.7)*10); // 7 intval(19.99*100) // 1998porovná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 0x0000FFPrá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é
Práce s řetězci - porovnání
==převádí číselné řetězce na čísla, tzn."1e1" == "10"jeTRUE- pro porovnání obsahu použijte
===
- 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
- explicitně:
(string), strval() - boolean: TRUE →
1, FALSE →"" - objekty: __toString()
- serializace:
Pole
- uspořádaná mapa - klíč ⇒ hodnota
- klíčem je integer nebo string, hodnotou cokoli (i další pole)
- automatické indexy (klíče) od
0nebo 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"]; // 42Práce s polem - základní operace
- přidání prvku
- na konkrétní místo -
$a[10] = … - na konec pole -
$a[] = …
- na konkrétní místo -
- 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;
- hodnotou -
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 - …
- iterování -