为什么?我配置的phpadmin经常有这样的...
错误 联系数据表的附加功能未能启动, 请按此 查出问题原因. ...
作者 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快得多
关于eval,我想大家的理解都不错误。。。
又不是PHP独有的eval,js里用的比PHP更广泛。
像你那样做,我想看看你的for.tpl怎么写?
foreach($str as $v)echo $v;
管他慢不慢,开发效率高行,这个有时要比运行效率重要
问题就在这了。。。呵呵
应该在模板里的没在模板里(this is)。这个换到模板里去。
而不应该在模板里的却在模板里了(foreach....)
模板是为了实现代码分离;但想在你这么做有意义吗?:)
你可以继续改进,把foreach变成{foreach...}的形式。不过其实和SMARTY走上了同一条路。我觉得你应该把SMARTY的代码研究一下先,这样对你的分析会有帮助。你知道SMARTY他是怎么处理的么?呵呵。。。
话有说回来,我一直觉得模板不应该走极端,只要速度不要可读性。我并不认同SMARTY那种“在语言基础上再造语言的”的做法,哪怕是简单的语句。这本身就不符合MVC实现的目的的,这不是南辕北辙的做法么?
我理想中的模板,的确应该用eval去实现。。。简简单单的,真正的代码分离,而不是要最高的速度。
这个用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);
}
这个用eval实现的和smarty模板的写法差不多的
不过我心目中的模板就是一个eval("echo"$str";");他的速度是谁也无法比的
http://218.244.44.113/happy/showthread.php?s=&threadid=40413
:)
既然想比较当然要“公正”了
SMARTY也是要做正则替换的。。。如果你不做当然比他快(正则替换可是个费时间的东西)
然后。。。如果你刷新,你的模板还要“正则”替换。可SMARTY不要了,他把刚才替换好的编译成一个.php文件,以后直接读取那个.php文件。。。这时,你觉得那个快?
:)
我还是恩希望你能把这个模板类做好!
其实,我想在想要一个精简版的SMARTY模板,SMARTY太大了。。。PHP解析要浪费时间
QUOTE: 最初由 KnightE 发布
[B]问题就在这了。。。呵呵
应该在模板里的没在模板里(this is)。这个换到模板里去。
而不应该在模板里的却在模板里了(foreach....)
模板是为了实现代码分离;但想在你这么做有意义吗?:)
你可以继续改...以下省略 [/B]
晕,smart还不是一样{loop:**}{/loop}其实和这个有什么区别呢,你可以看看我写的smarty标签式的(eval)
QUOTE: 最初由 wwwc 发布
[B]这个用eval实现的和smarty模板的写法差不多的
不过我心目中的模板就是一个eval("echo"$str";");他的速度是谁也无法比的
http://218.244.44.113/happy/showthread.php?s=&threadid=40413 [/B]
当初我的模板类也是写的。。。
还加了缓存和静态页面输出等功能
QUOTE:
我有话要讲:(可以匿名发表, 发广告的有多远请滚多远!!!)
昵称: 请输入验证码:
抢着回答
10 条回复
回复