InfoQ

交流

讨论:hkfuk进来,你的测试是错误的,eval比smarty快得多

作者 wwwc 发布于 2003-09-02 分类:php基础编程

看来你还没真正理解eval函数的工作原理,在现在的php中文手册上的介绍是非常片面的,eval($str)的真正原理是把$str当成php程式来解析的,字符替换只不过是他程式的一部分。(工作的时候,首先检查里面的字符语法对不对,不对的话就什么都不执行,eval出错,正确的话就全部执行)你把eval的测试部分改一下就可以了。
eval里面的字符本来就是php程序的一部分,任何字符替换都不可能超过程序本身的
for.tpl的内容

foreach($str as $v)echo $v;

测试部分内容
for($i=1;$i<10000;$i++)$str[]="this is ".$i;

$fp=fopen("for.tpl","r"); //以读方式打开文件
$msg=fread($fp,filesize("for.tpl")); //读文件内容
eval($msg); //输出字符

你看看执行时间,smarty的速度还快吗?简直是。。。。哎!我不说了你自己看

你自己可以看看
$str="$a=123;$a++;echo $a; echo"

';echo time();";
eval($str);
的结果是什么,看是不是按php语法来的



逛论坛交流hkfuk进来,你的测试是错误的,eval比smarty快得多

加入书签
digg+,
reddit+,
del.icio.us+,
dzone+

10 条回复

回复

关于eval,我想大家的理解都不错误。。.. 发表人 KnightE 发表于 09月21日
foreach($str as $v)echo $v; 发表人 wwwc 发表于 09月21日
管他慢不慢,开发效率高行,这个有时要.. 发表人 巴豆 发表于 09月21日
问题就在这了。。。呵呵 应该在模.. 发表人 KnightE 发表于 09月21日
这个用eval实现的和smarty模板的写法差.. 发表人 wwwc 发表于 09月21日
:) 既然想比较当然要“公正”了 .. 发表人 KnightE 发表于 09月21日
QUOTE: 最初由 KnightE 发布 .. 发表人 wwwc 发表于 09月21日
QUOTE: 最初由 wwwc 发布 [B.. 发表人 KnightE 发表于 09月21日
QUOTE: 发表人 KnightE 发表于 09月21日
  1. 关于eval,我想大家的理解都不错误。。。
    又不是PHP独有的eval,js里用的比PHP更广泛。

    像你那样做,我想看看你的for.tpl怎么写?

  2. foreach($str as $v)echo $v;

  3. 管他慢不慢,开发效率高行,这个有时要比运行效率重要

  4. 问题就在这了。。。呵呵

    应该在模板里的没在模板里(this is)。这个换到模板里去。
    而不应该在模板里的却在模板里了(foreach....)

    模板是为了实现代码分离;但想在你这么做有意义吗?:)

    你可以继续改进,把foreach变成{foreach...}的形式。不过其实和SMARTY走上了同一条路。我觉得你应该把SMARTY的代码研究一下先,这样对你的分析会有帮助。你知道SMARTY他是怎么处理的么?呵呵。。。

    话有说回来,我一直觉得模板不应该走极端,只要速度不要可读性。我并不认同SMARTY那种“在语言基础上再造语言的”的做法,哪怕是简单的语句。这本身就不符合MVC实现的目的的,这不是南辕北辙的做法么?

    我理想中的模板,的确应该用eval去实现。。。简简单单的,真正的代码分离,而不是要最高的速度。

  5. 这个用eval写的模板(速度好象比较慢,主要是正规表达试的原因)
    for.tpl
    {*模板这里开始*}
    {loop:for($a as $v)} {*循环开始*}
    {$v} {*输出变量*}
    {/loop:} {*循环结束*}
    {*模板这里结束*}

    function cqlctpl($file) /*函数作者,cqlc,主页:http://www.cqlc.net,
    中文档案 http://www.cqlc.net/cn_cqlctpl.txt */
    {
    $fp=fopen($file,"r");
    $msg="echo"".str_replace(""","\"",fread($fp,filesize($file)))."";";
    fclose($fp);
    $oldstr=array(0=>"/{loop[^}]+)}(.+){/loop}/si",
    1=>"/{logi[^}]+)}(.+){/logi}/si",
    2=>"/{exec[^}]+)}/si",
    3=>"/({*[^*]+*})/si"
    );
    $newstr=array(0=>"";\1{echo"\2";}echo"",
    1=>"";\1{echo"\2";}echo"",
    2=>"";\1;echo"",
    3=>""
    );
    return preg_replace($oldstr,$newstr,$msg);
    }

  6. 这个用eval实现的和smarty模板的写法差不多的
    不过我心目中的模板就是一个eval("echo"$str";");他的速度是谁也无法比的
    http://218.244.44.113/happy/showthread.php?s=&threadid=40413

  7. :)
    既然想比较当然要“公正”了
    SMARTY也是要做正则替换的。。。如果你不做当然比他快(正则替换可是个费时间的东西)
    然后。。。如果你刷新,你的模板还要“正则”替换。可SMARTY不要了,他把刚才替换好的编译成一个.php文件,以后直接读取那个.php文件。。。这时,你觉得那个快?

    :)
    我还是恩希望你能把这个模板类做好!
    其实,我想在想要一个精简版的SMARTY模板,SMARTY太大了。。。PHP解析要浪费时间


  8. QUOTE:
    最初由 KnightE 发布
    [B]问题就在这了。。。呵呵

    应该在模板里的没在模板里(this is)。这个换到模板里去。
    而不应该在模板里的却在模板里了(foreach....)

    模板是为了实现代码分离;但想在你这么做有意义吗?:)

    你可以继续改...以下省略 [/B]

    晕,smart还不是一样{loop:**}{/loop}其实和这个有什么区别呢,你可以看看我写的smarty标签式的(eval)


  9. QUOTE:
    最初由 wwwc 发布
    [B]这个用eval实现的和smarty模板的写法差不多的
    不过我心目中的模板就是一个eval("echo"$str";");他的速度是谁也无法比的
    http://218.244.44.113/happy/showthread.php?s=&threadid=40413 [/B]


    当初我的模板类也是写的。。。
    还加了缓存和静态页面输出等功能


  10. QUOTE:




  11. 我有话要讲:(可以匿名发表, 发广告的有多远请滚多远!!!)

    昵称: 请输入验证码:


  12. 抢着回答

    为什么?我配置的phpadmin经常有这样的...

    错误 联系数据表的附加功能未能启动, 请按此 查出问题原因. ...

    这样的服务器可以用吗?

    http://localhost/cn8cn/test-1.php http://localhost/cn8cn...

    关于在phpmyadmin中修改权限

    我修改好后怎么还是不能对表进行相应的插入、修改和删除操作呢?...

    APAche 的目录认证安全性有多高呢??

    大家讨论一下!

    php源程序被加密了,怎么解密?

    php源程序被加密了,是一堆乱码。以zend开头的。怎么解密!

    如果遭遇激情你会怎样!!!!!

    很不好意思,我发现我刚才心里胆怯了, 各位ggjj们有什么建议,

    各位大大,能否分享你们现在用的网站流...

    能否拿出你们现在用的网站流量分析系统来让大伙分享分享啊? ...

    请问!急!急!急!急!

    现在碰到一个问题,不知道怎么搞了啊! 我用require 去包含...

    咱村里哪个上面的哪个导航的哪个蓝是哪...

    谢谢帮我一下。

    怎样将用户输入的字符全变为大写的?

    如题

    []