2015. már 13.

Változó változók

írta: Bozzai Gyula
Változó változók

valtozo_v_01_k.jpg

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>

 

Szólj hozzá

echo foreach switch case változó változók dinamikus változó variable variables