今天研究discuz源码的时候,根据default模板生成缓存模板中有这么一段代码:
$template = preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\}[\n\r\t]*/ies", "\$this->stripvtags('<? if(is_array(\\1)) foreach(\\1 as \\2) { ?>')", $template);
$template = preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}[\n\r\t]*/ies", "\$this->stripvtags('<? if(is_array(\\1)) foreach(\\1 as \\2 => \\3) { ?>')", $template);
$template = preg_replace("/\{\/loop\}/i", "<? } ?>", $template);
正则替换的第二项的双引号中有$this->stripvtags,实际上调用了当前类的方法stripvtags进行了运算。双引号里边的东西会调用php解释器呀,我了个大去。以前对此印象不是很深,特此加深印象。
单引号双引号区别如下:
一般情况下,建议都使用单引号,只有在这个字符串需要进行计算时才使用双引号。
比如:
$_POST['pwd'] 与 $_POST["$pwd"],其区别在于 "$pwd" 需要进行计算后 以 $pwd 变量的值代替。
而 $_POST['pwd'] 和 $_POST["pwd"] 从功能上看没有什么区别,主要的区别在于:执行效率,因为PHP对于双引号包含起来的字符串要进行扫描计算,单引号则不管内容如何都会原因输出而不会进行计算。
与 $_POST[pwd] 的区别在于:
PHP会对于没有用单引号或双引号包含起来的,首先会猜测这是个全局常量,而如果找不到会将之做为字符串,但通常不建议这样写,只有在某些场合会这么写,以下是示例:
$s = "param:$_POST[pwd]";
而不能写成:
$s = "param:$_POST['pwd']";
此外,正则替换中还用到了捕获组。