表格代码在飞行和eval()它为可重复的代码块 - PRO&魂斗罗?

时间:2012-08-25 03:34:23

标签: php eval

我正在阅读OpenCart和phpBB引擎的课程,并注意到有很多字符串(有时是全屏列表)和重复代码,它们只在一个参数中有所不同。如:

$this->data['button_cart'] = $this->language->get('button_cart');
$this->data['button_wishlist'] = $this->language->get('button_wishlist');
$this->data['button_compare'] = $this->language->get('button_compare');
$this->data['button_continue'] = $this->language->get('button_continue');

我正在考虑使用函数使用paterns生成代码,然后eval()

一些这样的功能:

function CodeGenerator($patern, $placements_arr){
    $echo_str = '';
    foreach($placements_arr as $placement){
        $echo_str .= str_replace('=PATERN=', $placement, $patern);
    }
    if(substr($echo_str, -1)!==';'){
        $echo_str .= ';'; # for correct eval() working
    }
    return $echo_str;
}

然后对于具有相同模式的大量重复代码块:

$patern = "$this->data['=PATERN='] = $this->language->get('=PATERN=');";
$placements_arr = array('button_cart', 'button_wishlist', 'button_compare', 'button_continue');
$echo_str = CodeGenerator($patern, $placements_arr);
eval($echo_str);

我想了解这种设计的PRO和CONTRA,因为我正在考虑在未来的开发中使用这样的设计。

我现在看到的唯一问题 - 执行速度稍慢。还有其他人吗?

2 个答案:

答案 0 :(得分:3)

你所展示的代码块可以像这样重写它

$params = array('button_cart', 'button_wishlist', 'button_compare', 'button_continue');

foreach($params as $param)
   $this->data[$param] = $this->language->get($param);

你正在写出参数,所以我看不出你的代码有什么好处,就像我上面所说的那样。另外,这只有3行代码而不是你的11行代码,而且我的代码可以立即读取

在您编写的99.9%的代码中,您可以在没有eval的情况下编写代码。有一些极端情况下eval是有意义的,但是在我编写php的5年中,到目前为止,我已经使用了它一两次,如果我回到代码,我可能会重写它,所以它没有。< / p>

如果我必须使用您编写的代码维护一个项目,我会撕掉我的头发。看看OpenCart写的是什么,看看你写的是什么。哪一个更容易理解?实际上,我必须多次查看您的代码以了解它的作用,我可以浏览OpenCart代码并立即了解正在发生的事情。

答案 1 :(得分:1)

可维护性 - 如果这是一个词 - 可能是一个小问题。我会鄙视这样一个结构,因为它似乎不必要地复杂。我继承了许多设计糟糕的php网站,作为一个网络开发人员工作,在几乎零的情况下我可以回想起它被认为是一个麻烦,必须通过上面的var分配列表。但是,由于不得不处理试图逃避重复打字平庸的奇怪懒惰函数,我会感到愤怒。

最后,你正在谈论处理的几分之一秒,所以这几乎不是做这样的事情的论据。如果微秒是一个问题,使用缓存机制写入平面文本并一起消除所有冗余处理。

嘿,我的2美分。如果这是你的项目而且你不希望其他任何人维护它,那么就把自己打倒。