01 - Základní syntaxe a datové typy
Základy jazyka PHP
Vlastnosti PHP
- Obecně použitelný interpretovaný skriptovací jazyk
- od počátku zaměřený na web
- Dynamicky typovaný
- Objektově orientovaný
- Rozsáhlá sada dostupných knihoven
- řetězce, databáze, grafika, reflexe …
- Snadno integrovatelný do řady webových serverů
- modul, CGI/FastCGI
- Open-source
Syntaxe - hraniční značky
- Otevírací a zavírací značka
<?php
a?>
- oddělení HTML a PHP
- text mimo značky se nezpracovává → přímo odesílán klientovi
- různé varianty značek (
<?
,<%
…)
- Příkazy se oddělují znakem
;
- Blok je ohraničen složenými závorkami
{
a}
- za uzavírací závorkou bloku se
;
nepíše
- za uzavírací závorkou bloku se
- C-like, BASH-like …
Syntaxe - komentáře
/**
Tenhle kousek kodu vypise Hello World
a my k tomu mame viceradkovy komentar!
*/
echo "Hello World"; // JEDNORADKOVY KOMENTAR
/**
* Specialni komentar napr. pro PHPDocumentor (~javadoc)
* @var string $hello
*/
$hello = 'world';
Proměnné
Jsou označeny znakem
$
$jmenoPromenne = 5;
- jména jsou case-sensitive
[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
- Výchozí je přiřazení hodnotou
- Neinicializované proměnné - výchozí hodnota podle typu
FALSE, 0, "", array(), null
Proměnné proměnné
- Dynamické pojmenování proměnné
- Použitelné více v OOP
$jmeno = 'promenna';
$$jmeno = 'hodnota';
echo "Promenna pojmenovana: $jmeno
obsahuje hodnotu: ${$jmeno}";
Konstanty
- Hodnotu během výpočtu nelze změnit
- Pojmenování - stejná pravidla jako u proměnných
Jednoduché datové typy a pole
const BAR = 'something'; // historicky, jen mimo tridu define('FOO', 'something');
- Magické konstanty (výběr)
__FILE__
,__LINE__
,__DIR__
__FUNCTION__
,__CLASS__
,__METHOD__
Reference (odkazy)
- Různá pojmenování pro stejný obsah →
- jméno proměnné
- obsah proměnné
- Nejsou to pointery! Nelze pointerová aritmetika!
- Přiřazení referencí, předání referencí, návrat referencí
$a = 5; $b = &$a;
$b = 1; echo $a;
Viditelnost proměnných (a)
Proměnné jsou viditelné pouze v kontextu, ve kterém byly definovány.
- global, local, static
- superglobal
$p = "globalni promenna";
function f() {
echo "$p";
}
f();
Viditelnost proměnných (b)
Globální proměnná
$p = "globalni promenna";
function f() {
global $p;
echo "$p";
}
f();
Viditelnost proměnných (c)
Lokální proměnná
$p = "globalni promenna";
function f() {
$p = "lokalni promenna";
echo "$p";
}
f();
Viditelnost proměnných (d)
Statická proměnná
function f() {
static $p = 0;
$p++;
echo $p;
}
f(); f(); f();
Proměnné z externích zdrojů
Obsluha HTTP požadavku →
- řádek požadavku (metoda, URI)
- HTTP hlavičky (prohlížeč, jazyk, …)
- tělo požadavku (POST)
Superglobální pole:
$_GET, $_POST, $_COOKIE, $_REQUEST
Potenciálně nebezpečné → kontrola vstupu!
Funkce pro práci s proměnnými
isset($prom)
empty($prom)
- TRUE pokud
0
, FALSE, NULL,""
,[]
- TRUE pokud
is_numeric($prom)
- TRUE pokud
0
,"0"
,"0.0"
, …
- TRUE pokud
is_{bool,integer,float,string,…}($prom)
is_array($prom)
,is_object($prom)
unset($prom)
viz také: get_class
, instanceof
Datové typy
PHP je dynamicky typovaný jazyk - datový typ je určen až za běhu!
- jednoduché - boolean, integer, float, string
- složené - pole, objekt
- speciální - resource, NULL
- pseudotypy (dokumentace) - mixed, number, callback
String - řetězce (a)
Single quoted
$a = 'single quoted - symbol \', escape \\'; $b = '$a';
Double quoted, simple/complex variable parsing
echo "{$a}\n$b";
Heredoc
$c = <<<HEREDOC Tohle je heredoc, hodnota proměnné $a lze odřádkovat,používat " a '. HEREDOC;
String - řetězce (b)
- Nowdoc - Heredoc, ale neprovádí se náhrady (single quoted)
- strcmp($str1, $str2), binárně bezpečná
0
- rovnost,1
- $str1 > $str2,-1
- $str1 < $str2
viz <=>
, Strings
Pole
- Asociativní vícerozměrná pole
- Libovolné typy
- Implicitně se pole indexují celočíselně počínaje 0
$arr = [
"array" => [5, 13 => 9, 8, "a" => 42]
];
$arr = array(
"array" => array(5, 13 => 9, 8, "a" => 42)
);
echo $arr["array"][0]; // 5
echo $arr["array"][13]; // 9
echo $arr["array"][14]; // 8
echo $arr["array"]["a"]; // 42
viz Array Functions
Přetypování (a)
Implicitní
$a = "5"; $a = $a + 5; echo $a;
Explicitní
$numstr = "5"; $number = (int) $numstr; $number = intval($numstr);
Přetypování (b)
- Boolean -
0
,''
,""
→ FALSE, vše ostatní TRUE - Numeric -
1
,'1'
→ 1
Operátory - priorita
Priorita | Operátor | Priorita | Operátor |
---|---|---|---|
1 | clone new | 12 | & |
2 | [ array | 13 | ^ |
3 | ** | 14 | | |
4 | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | 15 | && |
5 | instanceof | 16 | || |
6 | ! | 17 | ?? |
7 | * / % | 18 | ? : |
8 | + - . | 19 | = += -= *= **= /= .= %= &= |= ^= <<= >>= |
9 | << >> | 20 | and |
10 | < <= > >= | 21 | xor |
11 | == != === !== <> <=> | 22 | or |
Operátory - porovnání
- rovnost
$a == $b
, resp. nerovnost$a != $b
- porovnává se pouze hodnota nikoliv datový typ
- u objektů se porovnávají hodnoty atributů
- identita
$a === $b
, resp. neidentita$a !== $b
- porovnává se nejen hodnota ale i datový typ
- u objektů se porovnávají reference (identický objekt)
.
Operátor - operátor zřetězení
- neobvyklé oproti jiným jazykům
echo "Zpracovano " . count($rows) . " radek\n";
@
Operátor potlačení chybové zprávy
@mkdir("data/$user", 0755)
<=>
Operátor - spaceship operator
- princip
strcmp
"ahoj" <=> "svete" // -1
5 <=> 3 // 1
"7" <=> 7 // 0
?:
Operátor - elvis operator
- výsledkem je první operand pokud je TRUE, jinak druhý operand
$a ?: $b
je zkratka za ternární výraz$a ? $a : $b
null ?: 'fail' // fail
5 ?: 2 // 5
??
Operátor - null coalescing operator
- výsledkem je první operand pokud vyhoví
isset
tj. existuje a není NULL
$imageData = json_decode($content);
$width = $imageData['width'] ?? 100;
Řídící struktury
- větvení -
if
/elseif
/else
,switch
- cykly -
while
,for
,foreach
,break
,continue
require
/require_once
,include
/include_once
Větvení (a)
if ($a > $b)
echo "a is bigger than b";
elseif ($a == $b) {
echo "a is equal to b";
}
else
echo "a is smaller than b";
Větvení (b)
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
}
Větvení (c) - match (PHP 8)
Cykly (a)
$i = 10;
while ($i < 10) {
echo $i++;
}
$i = 10;
do {
echo $i++;
} while ($i < 10);
Cykly (b)
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
- vyskočení z cyklu/switch -
break [n]
- další iterace -
continue [n]
Cykly (c)
$arr = array (
'k1' => 1, 'k2' => 2, 'k3' => 3);
foreach ($arr as $key => $value)
echo "$key: $value";
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value)
$value = $value * 2;
print_r($arr);
Funkce
- Pojmenování - obdobně jako proměnné, case-insensitive (narozdíl od proměnných)
- Definice → použití
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Example function.\n";
return $retval;
}
foo(1, 2, ..., n);
Funkce - předávání argumentů (a)
Hodnotou (implicitní)
function f1($i) { $i[0] = 100; } $x = [1, 2]; f1($x);
Odkazem
function f1(&$i) { $i[0] = 100; } $x = [1, 2]; f1($x);
Funkce - proměnlivý počet argumentů
Pomocí …
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
Funkce - předávání argumetů z pole
…
lze použít i opačně
function add($a, $b) {
return $a + $b;
}
$x = [1, 2];
echo add(...$x);
Funkce - předávání argumentů (b)
- Argument může mít výchozí hodnotu
- musí být na konci, lze jej vynechat
- lze použít jednoduché datové typy, pole a NULL
- PHP nepodporuje přetěžování funkcí
function p($n, $e = 2)
{
return $n ** $e;
}
echo p(4);
echo p(3,3);
Funkce - návratová hodnota
Hodnota nebo reference?
function hodnota() { static $arr = array(1, 2); return $arr; } function &reference() { static $arr = array(1, 2); return $arr; } $a = hodnota(); $b = &reference(); $a[] = 3; $b[] = 4; $a = hodnota(); $b = &reference();
Proměnné funkce
Dynamicky určené jméno funkce, která se má volat
function foo($arg1, $arg2, ..., $argn) { ... } $func = 'foo'; $func(arg1, arg2, ..., argn);
Načítání a vykonání externích souborů
- require(cesta), require_once(cesta)
- include(cesta), include_once(cesta)
Datové typy a výrazy
Pravdivostní hodnoty
TRUE
,FALSE
- case insensitive
explicitní konverze
(bool)
(boolean)
implicitní konverze
0
,""
,[]
,null
→ FALSE
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) // 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
$string = '$string'; $string = <<<'END' Variables are not expanded in nowdoc, try it: $string = $string; END;
double quoted, heredoc
$string = "$string"; //empty string $string = <<<END Variables are expanded in heredoc, try it: \$string = $string; 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];
echo "{${f()}['green']}";
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é
Práce s řetězci - konverze
- explicitně:
(string)
, strval() - boolean: TRUE →
1
, FALSE →""
- objekty: __toString()
- serializace:
Pole
- uspořádaná mapa - klíč ⇒ hodnota
- automatické indexy (klíče) od
0
nebo jako asociativní pole - použití
- vektor
- hash tabulka, slovník
Pole - literál
$array = [
"foo" => "bar",
42 => 24,
"multi" => [
"dimensional" => [
"array" => "foo"
]
]
];
původní syntaxe array( … )
, od PHP 7 pohodlnější [ … ]
Prá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í -