Változó változók
Ha komolyabb programkódot kezdünk tanulmányozni, találkozhatunk a változó változókkal (Variable variables). Ebben a posztban ezekről fogok írni.
A témában nem fogunk túlságosan elmélyülni, de nem árt tisztában lenni az alapokkal. Miről is van szó? Leegyszerűsítve azt mondhatnám, hogy a változó nevét nem előre adjuk meg a megszokott módon, hanem a programunkban generáljuk. Vagy szakszerűen: dinamikusan adunk nevet a változónak.
Legegyszerűbben példákon keresztül tudom elmagyarázni, hogy miről is beszélek:
<?php
$a = "simple";
$simple = "PHP";
echo $a;
echo $simple; //simplePHP
?>
A fenti kód egyszerű, létrehozunk két változót, majd kiíratjuk őket. Az eredmény értelemszerűen "simplePHP" lesz.
Folytassuk a kódot, és alkalmazzunk dinamikus változót:
<?php
$a = "simple";
$simple = "PHP";
echo $a;
echo $simple; //simplePHP
echo "<br />"; // Sortörés
echo $a;
echo $$a; //simplePHP
?>
Nos, mi történt? Először kiírattuk a $a változó értékét (simple), majd használtuk a $$a változót, amely eredményül a "PHP" értéket adta. Ez úgy lehetséges, hogy mivel $a = simple, azaz ${$a} = ${simple}, vagyis $$a = $simple, ami pedig egyenlő a "PHP"-vel. Remélem érthető.
Amúgy a kapcsos zárójel használatát megérti a PHP, és érthetőbbé teszi a dinamikus változónkat, ezért használjuk bátran. A fenti kód ismét, de most kapcsos zárójelekkel kiegészítve:
<?php
$a = "simple";
$simple = "PHP";
echo $a;
echo $simple;
echo "<br />"; // Sortörés
echo $a; // simple
echo "<br />"; // Sortörés
echo ${$a}; // PHP
echo "<br />"; // Sortörés
echo ${simple}; // PHP
?>
Ugye, mindjárt érthetőbb?
Jó, akkor nézzünk egy érdekesebb esetet:
<?php
$mama = "papa";
$papa = "mama";
echo $$mama;
echo $$papa; //mamapapa
?>
Mint láthatjuk, a két változó egymásra hivatkozik: $$mama = ${$mama} = ${papa} = "mama", és $$papa = ${$papa} = ${mama} = "papa".
Most, hogy tisztáztuk az alapokat, nézzük, mire is jó.
Néha szükség van arra, hogy a változók nevét dinamikusan határozzuk meg, vagy éppenséggel kényelmesebb használnunk őket. Arra mindenképpen figyeljünk, hogy az ésszerűség határain belül maradjunk, mert nehezebbé válhat a kódunk értelmezése.
Lássunk egy példát, ahol bemutatom, hogy a dinamikusan elnevezett változók, mennyire hasznosak is tudnak lenni:
<?php
$ing_fekete = "Ez az ing fekete.";
$ing_barna = "Barna színe van az ingnek.";
$ing_lila = "A lila ing különleges.";
$ing_narancs = "Az inge narancs színű.";
$ing_ibolya = "Az ing szép, mint egy ibolya.";
$ing = array("fekete", "lila", "narancs");
foreach ($ing as $i) {
switch ($i) {
case "fekete":
echo $ing_fekete;
break;
case "barna":
echo $ing_barna;
break;
case "lila":
echo $ing_lila;
break;
case "narancs":
echo $ing_narancs;
break;
case "ibolya":
echo $ing_ibolya;
break;
}
echo "<br />"; // Sortörés
}
?>
A példában a $ing nevű tömbben megadjuk, hogy milyen színű ingeink vannak, utána kiírjuk a színeknek megfelelő jellemzőket, amelyek $ing_szín formátumú változókban vannak eltárolva. Ahhoz, hogy eldöntsük, melyik jellemzőt kell kiírnunk, a switch utasítást használjuk. Minden egyes színnek egy új case ágat kell létrehoznunk. A példában ötféle szín van, de képzeljük el, hogy van mondjuk húsz, ekkor húsz case sorra lenne szükségünk.
Ilyenkor kényelmes igazán a dinamikus névmeghatározás:
<?php
$ing_fekete = "Ez az ing fekete.";
$ing_barna = "Barna színe van az ingnek.";
$ing_lila = "A lila ing különleges.";
$ing_narancs = "Az inge narancs színű.";
$ing_ibolya = "Az ing szép, mint egy ibolya.";
$ing = array("fekete", "lila", "narancs");
foreach ($ing as $i) {
echo ${"ing_" . $i};
echo "<br />"; // Sortörés
}
?>
Amint láthatjuk, a hosszú switch utasítást kiváltottuk mindössze egyetlen sorral.
A témát hosszan lehetne még elemezni, de itt most nem tesszük.
Ha első olvasásra nehéz megérteni a dinamikus változó neveket, olvassuk el többször, és kísérletezzünk a példák változtatásával.
És végül futtatható formában az "ingek.php" program:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ingek színei</title>
</head>
<body>
<?php
$ing_fekete = "Ez az ing fekete.";
$ing_barna = "Barna színe van az ingnek.";
$ing_lila = "A lila ing különleges.";
$ing_narancs = "Az inge narancs színű.";
$ing_ibolya = "Az ing szép, mint egy ibolya.";
$ing = array("fekete", "lila", "narancs");
foreach ($ing as $i) {
/*
switch ($i) {
case "fekete":
echo $ing_fekete;
break;
case "barna":
echo $ing_barna;
break;
case "lila":
echo $ing_lila;
break;
case "narancs":
echo $ing_narancs;
break;
case "ibolya":
echo $ing_ibolya;
break;
}
*/
echo ${"ing_" . $i};
echo "<br />"; // Sortörés
}
?>
</body>
</html>