BinSpeak

dev@blog

eval ist böse

Oktober 31st, 2008 by admin

Heute habe ich mal wieder einen eval-Ausdruck in dem PHP-Code an dem ich gerade arbeite gefunden, der in etwa folgendermaßen aussah (stark vereinfacht dargestellt):

<?
    function calc($a, $b, $sign) {
        eval ('$z = $a ' . $sign . ' $b;');
        return $z;
    }

    $x    = 5;
    $y    = 3;
    echo calc($x, $y, '+') . "\n";
    echo calc($x, $y, '-');

    // Output:
    // 8
    // 2
?>

Das Ziel der Funktion ist klar, man will abhängig von einem Vorzeichen entweder addieren oder subtrahieren. Nun ist eval ja böse, ist hier aber auch gar nicht nötig, weil man das ganze auch mit einem intlösen kann, der 1 oder -1 ist.

<?
    function calc($a, $b, $sign) {
        return $a + $sign * $b;
    }

    $x    = 5;
    $y    = 3;
    echo calc($x, $y, 1) . "\n";
    echo calc($x, $y, -1);

    // Output:
    // 8
    // 2
?>

Ab und zu hatte ich schon einen bool-Wert der festlegte, wie zu rechnen ist, auch den kann man direkt an die Funktion übergeben, das ganze sieht dann so aus:

<?
    function calc($a, $b, $sign) {
        return $a + ((2*$sign)-1) * $b;
    }

    $x    = 5;
    $y    = 3;
    echo calc($x, $y, true) . "\n";
    echo calc($x, $y, false);

    // Output:
    // 8
    // 2
?>

Hier macht man sich zunutze, das true bei Berechnungen zu 1 ausgewertet wird. 2*$sign-1 ergibt dann eben 1 wenn $sign=true (also 1) ist, und es ergibt -1 wenn $sign=false (also 0) ist. So man kann die Variable Sign in einem Bit (z.B. in einer Datenbank) speichern.

This entry was posted on Freitag, Oktober 31st, 2008 at 15:08 and is filed under hint. You can follow any responses to this entry through the RSS 2.0 feed. Responses are currently closed, but you can trackback from your own site.

Comments are closed.