Proměnné v PHP

Tato stránka je kompletní shrnutí fungování proměnných v PHP. Text je psán mírně odborným stylem a začátečníci mu nemusí plně rozumět. Pokud vás zajímají úplné základy, tak si přečtěte tutoriál pro začátečníky a zásady zápisu proměnných.

Popis

Proměnná je virtuální místo v operační paměti, je definována pomocí názvu, datového typu a obsahu.

PHP proměnné interně reprezentuje jako tvz. hashovací tabulku, tj. všechny proměnné jsou uloženy v tabulce, která se velice rychle prohledává, proto čas potřebný k přístupu ke každé promněnné je téměř konstantní.

Příklady zápisu:

$a = 10;
$b = "kočka";
$c = TRUE;

Každý řádek v ukázce značí definici jedné proměnné. Název každé proměnné začíná znakem dolaru $ následovaný samotným názvem. Znakem rovnítka můžeme přiřadit do proměnné hodnotu.

Interně budou proměnné uloženy do paměti jako hashovací tabulka:

Název Typ Hodnota
a integer 10
b string kočka
c boolean TRUE

Typy proměnných

Proměnné se rozdělují podle přístupových práv a způsobu použití:

Povolený obsah proměnných

Proměnné mohou obsahovat cokoli, co dovoluje jejich aktuální datový typ. Pokud datový typ neuvedeme, bude určen automaticky, podle obsahu (tento postup se příliš nedoporučuje, protože může vést k chybám).

Datové typ fungují samostatně, proto můžeme používat téměř jakékoli typy. Pokud však chceme provést nějakou slučovací operaci, tak musíme vždy zajistit převod na jeden formát.

Dobrým příkladem je třeba sčítání a násobení čísel:

$x = 5;         // integer
$y = 3;         // integer
$z = $y + $y;   // proměnná $z bude složena na základě více proměnných

V tomto případě stojí PHP před otázkou, jaký datový typ bude mít nově vzniklá proměnná $z. Pokud se jedná o stejné datové typy a operace je možná, tak se datový typ zdědí.

Někdy můžeme ovšem provádět operaci s více datovými typy:

$x = 1;         // integer
$y = 3.14159;   // float
$z = $y + $y;   // float

V tomto případě slučujeme integer a float. Výstupem bude desetinné číslo, proto se použije float. V tomto případě PHP provede něco, čemu se říká dynamické přetypování.

Na toto chování se ovšem nemůžeme vždy spolehnout. Jak byste například chtěli sloučit číslo a string?

$x = 256;       // integer
$y = 'Ahoj!';   // float
$z = $y + $y;   // ???

Datové typy (přehled nejdůležitějších)

PHP je jazyk interpretovaný, proto má některé zvláštnosti oproti jiným programovacím jazykům, jedna z nich je například ta, že u proměnných nemusíme uvádět datové typy, tj. každá proměnná svůj datový typ dynamicky mění podle svého obsahu (pokud není řečeno jinak). Přesto je dobré znát alespoň základní datové typy, hodí se to zejména u optimalizace aplikací nebo při práci s databází.

Zápis pak může vypadat následovně:

$x = (INT)25; // vytvoří proměnnou typu INT
Typ Název Popis
INTEGER Celé číslo Obsahuje pouze celé číslo. Maximální hodnota je určena podle počtu bitů. Na 32-bitovém PHP je rozsah od -2,147,483,648 do 2,147,483,647 (~ ± 2 miliardy), 64-bitové PHP má rozsah od -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 (~ ± 9 quintillionů). Maximální hodnotu můžeme vždy získat zavoláním konstanty PHP_INT_MAX.
FLOAT Desetinné číslo s plovoucí řádovou čárkou Jde o variantu čísla s plovoucí řádovou čárkou, pro které platí pravidlo „čím menší, tím přesnější“. Číslo se interně uloží jako tzv. mantisa a exponent, takže se vlastně ukládají 2 čísla, mezi kterými se provádí operace: mantisa * (2 ^ exponent), čímž je možné uložit opravdu obří rozsah čísel. Využívá se principu, že u velkých čísel nepotřebujeme vždy znát přesně jejich hodnotu, zato chceme ušetřit co nejvíc paměti.
STRING Řetězec Obsahuje posloupnost znaků, které se ohraničují pomocí uvozovek nebo apostrofů. Maximální délku omezuje jen kapacita operační paměti.
BOOLEAN Logická hodnota Logická hodnota z booleovy algebry, může obsahovat pouze TRUE (pravda) nebo FALSE (nepravda).
NULL Prázdná hodnota Občas nechceme do proměnné uložit nic. Často se lze setkat například s nulou (0) nebo prázdným řetězcem (''), nicméně jen NULL je správné řešení.

Dědičnost datového typu

Jaký datový typ bude mít proměnná $x, pokud známe jen tento kousek zdrojového kódu?

$x = $y;

Záleží na datovém typu proměnné $y, z kterého se bude dědit jak hodnota, tak i její datový typ. V tomto případě tedy neznáme proměnnou $x, proto nemůžeme pokračovat ve vyhodnocování kódu a vyhodilo by se chybové hlášení.

Dynamické přetypování

Mějme následující 2 proměnné:

$x = 10;
$y = "10";

Jaký je rozdíl mezi obsahy proměnných $x a $y?

Proměnná $x je číslo, $y je řetězec (obsahující znak „1“ a „0“), tedy v případě, že proměnnou pouze uložíme do paměti a nebudeme provádět nějakou operaci, která bude mít vliv na hodnotu. Například následující 2 zápisy budou vracet stejný výsledek:

echo $x + 5;    // vypíše 15
echo $y + 5;    // vypíše 15

V druhém případě dojde k takzvanému dynamickému přetypování, tj. proměnná převede svůj datový typ tak, aby bylo možné s ní provést výpočetní operaci. Na toto chování se nelze vždy spolehnout a jedná se spíše o korektivní chování, co má za úkol opravit špatně napsané scripty začátečníků. Pokud to je možné, tak čísla vždy zapisujte s datovým typem pro uložení čísel, protože se tím zvyšuje jejich přesnost a usnadňuje se budoucí použití.

Poznámka: Je potřeba si uvědomit, že nemůžeme převádět datové typy úplně libovolně a ne vždy je to tedy možné. Pokud budete přetypovávat datový typ na nějaký jiný (nekompatibilní) tak nemusí buď dojít k převodu vůbec, nebo se může původní obsah poškodit, či zcela zničit a nahradit za jiný. Pokud například budete přetypovávat řetězec na celé číslo (a v proměnné bude uložen nějaký text, který není číslem), tak bude místo číselné hodnoty do proměnné uložena hodnota 1.

Reprezentace řetězců jako pole

Všechny řetězce jsou interně uloženy jako pole znaků. Tj. každý znak má svůj vlastní index a lze se na něj odkázat. Pokud index neuvádíme, tak se pracuje s celým řetězcem.

$x = 'Programujme v PHP!';
$n = 3;

echo $x;        // toto vypíše celý obsah proměnné $x
echo $x[0];     // toto vypíše nultý znak proměnné $x
echo $x[$n];    // toto vypíše n-tý znak proměnné $x

Poznámka: PHP čísluje od nuly, tj. nultý znak je v tomto případě ‚P‘ a první znak je ‚r‘.

Kopírování proměnných

Mějme následující proměnnou:

$q = 'Lorem ipsum, ...';

A následně její hodnotu překopírujeme do další proměnné:

$qi = $q;

Naštěstí se žádné kopírování provádět nebude a PHP si jen uloží odkaz na hodnotu do hashovací tabulky. Hodnota se reálně překopíruje, až když by se měla hodnota některé z proměnných změnit. Toto chování zabezpečuje komponenta, které se obecně říká Garbridge collector.

Sponzorované odkazy
Pomohl Vám tento článek?