dedlfix: eval nicht mit mehrdimensionalen Arrays möglich?

Beitrag lesen

Hi!

hier mal ein einfaches Beispiel welches kein EVAL() verwendet und Dir evtl. sogar schon ausreichend die gewünschte Funktionalität als Basis liefert:

Was dem Beispiel fehlt sind Kommentare über das beabsichtigte Verhalten beziehungsweise die Intentionen hinter einigen Konstrukten.

const VAR_PATTERN         = '~[([^]]+)]~';
    const COMMENT_FORMAT      = '/* %s */';
    const PATH_DELIMITER      = '.';
    const ATTRIBUTE_DELIMITER = ';';
    const ATTRIBUTE_ASSIGN    = ':';
    const ELEMENT_DELIMITER   = ' ';

Welche Aufgaben haben die Konstanten. Besonders die ersten beiden scheinen mir erklärungswürdig, damit man sie anpassen kann, ohne erst mit Codeanalyse ihre Wirkung zu ermitteln.

public $vars = array();

vars ist nicht gerade ein sprechender Name. Was ist seine Aufgabe? Gibt es einen Namen, der besser zur Aufgabe passt?

$path = array_reverse(explode(self::PATH_DELIMITER, $matches[1]));

Warum muss das Array umgedreht werden? Kann das eingespart und im weiteren Verlauf array_shift() statt array_pop() verwendet werden?

$ref = & $this->vars;

Warum wird die Referenz angelegt? Ist das technisch notwendig? PHP ist clever genug, bei einer Variablenzuweisung keine echte Kopie anzulegen, solange es nicht wegen auseinanderlaufender Werte notwendig ist. Auch hier wieder ist ref kein aussagekräftiger Bezeichner.

// unbekannter array index - hier anfangen zu meckern...)
                return sprintf(self::COMMENT_FORMAT, $matches[0]);

Diese Funktionalität sollte in der Funktionsbeschreibung erwähnt werden, damit man erfährt, was mit Platzhaltern ohne Werte passiert. Hier steht zwar ein Kommentar, der aber nicht besonders sinnvoll ist, da er nicht zum Code passt.

protected function escape($value)
    public function parse($content)

Auch den beiden kann ein Kommentar zur Arbeitsweise und dem Inhalt der erwarteten Parameter nicht schaden (ebenso wie sprechendere Variablennamen).

Als Pluspunkt neben meiner Kritik kann ich aber die Codeformatierung erwähnen.

Grundsätzlich ist das mit dem fertigen Code immer so eine Sache. Der hilft dem Empfänger nur auf den ersten Blick. Man kann zwar daraus lernen, besonders wenn er verständlich geschrieben ist, aber die Erfahrung, die man beim Ausdenken des Lösungsweges, beim Recherchieren, Schreiben und Testen des Codes gesammelt hat sind, sind einem selbst zugeflossen und nicht dem Empfänger.

Lo!