今天阅读qeephp的源代码发现了php神奇的用法,小雷了我“两下”。写个随笔,分享下。

请阅读如下代码:

static function create($length = 4, $lefttime = 900,
                           $style = 'simple', array $options = null)

{
    $class_name = 'Helper_ImgCode' . ucfirst(strtolower(preg_replace('/[^a-z0-9_]+/i', '', $style)));
    $options = (array)$options;
    $options['code_length'] = $length;
    $imgcode_obj = new $class_name($options);
    $code = $imgcode_obj->generateCode();
    self::_writeImgcodeToSession($code, $lefttime);
    return $imgcode_obj->generateImage($code);
}

发现了吗?被调用的类名是动态构造的!!!

先将$style字符串去掉非法字符:preg_replace('/[^a-z0-9_]+/i', '', $style)

然后全部转化为小写:strtolower(preg_replace('/[^a-z0-9_]+/i', '', $style))

再把首字母大写:ucfirst(strtolower(preg_replace('/[^a-z0-9_]+/i', '', $style)))

连接之后变成了一个需要的类名:$class_name = 'Helper_ImgCode' . ucfirst(strtolower(preg_replace('/[^a-z0-9_]+/i', '', $style)));

最后通过类名变量调用类代码,创建了一个对象:$imgcode_obj = new $class_name($options);

短短的两行代码,省去了switch语句繁杂。

好处不只是在于简洁,以后想要有不同的style来处理的话只需要改变$style值,然后再写一个对应的类就可以了。达到了很好的扩展性。

posted on 2011-02-18 14:52  Neoh  阅读(694)  评论(2编辑  收藏  举报