function _eval($content)
    {
        ob_start();
        eval('?' . '>' . trim($content));
        $content = ob_get_contents();
        ob_end_clean();        return $content;
    }
请问eval的用法,这样的用法目的何在,谢谢

解决方案 »

  1.   

    $content里为php代码.
    执行后会输出html,
    利用ob_*系列函数,获取$content内容的输出.
      

  2.   

    eval — Evaluate a string as PHP code
      

  3.   

    $content应该是个完整的php代码,意思是带<?php ?>这样的闭合标签。
    <?php
    function _eval($content)
    {
    ob_start();
    eval('?' . '>' . trim($content));
    $content = ob_get_contents();
    ob_end_clean(); return $content;

    echo _eval('<?php echo "hello world";?>');
    ?>
      

  4.   

    <?php
    function _eval($content)
    {
    ob_start();
    eval('?' . '>' . trim($content)); //这里eval '?'.'>'是要考虑$content里php代码混合html代码的情况,适用于模板
    $content = ob_get_contents();
    ob_end_clean(); return $content;

    echo _eval('<input type="text"/><?php echo "hello world";?><input type="text"/>');
    ?>
      

  5.   

    eval 用法:$name = 'abcd';
    $content = 'the name is $name';//这边用单引号和双引号区别很大
    eval("\$content = \"$content\";");//这边的作用就是给  $content 重新附值   结果变成了  $content = "the name is $name";
    echo  $content; //结果就是 the name is abcd;下面代码结果一样:
    $name = 'abcd';
    $content = "the name is $name";//
    echo $content;
      

  6.   

    感谢foolbirdflyfirst,
    对我就是想问这个,还是不明白为什么要加 '?' . '>' .
    你的例子非常好
    echo _eval('<input type="text"/><?php echo "hello world";?><input type="text"/>');
      

  7.   

    以上的代码解析成
    ==========================================
    <?php
    /**==eval开始==**/?>//这里就是eval里的那个'?'.'>'<input type="text"/>
    <?php 
    echo "hello world"
    ;?>
    <input type="text"/>
    /**==eval结束==**/
    ?>
    =====================================假如没有eval '?'.'>'
    就解析成
    ===================================
    <?php
    /**==eval开始==**/<input type="text"/>
    <?php 
    echo "hello world"
    ;?>
    <input type="text"/>
    /**==eval结束==**/
    ?>
    解析错误
    -->
    </pre>
      

  8.   

    那请问为什么头部会多一个
    <?php呢?
      

  9.   

    头部那个是程序页面本身的<?php标签阿
      

  10.   

    并且我如果这样echo _eval('?><?php echo "hello world";?><?php');
    最后想加"<?php "和你给出的最后这个"?>"配对,为什么不行啊?
      

  11.   

    echo _eval('?> <?php echo "hello world";?> <?php ;'); //eval内每一句php格式的字符串格式要加;结束,最前面那个?>在函数里已经加了,没必要在这里加了。
      

  12.   

    说实话不是很理解,我试过<?php echo "hello world"?> 就可以不存在";",号,哎谢谢了,
    我确实不是太明白 
      

  13.   

    嗯,我说的不准确,你的例子中用了ob_start缓存输出,最有一个<?php解析有问题。。
    <?php 
    //这样清晰一点
    eval('?><input type="text"/><?php echo "hello world"?><input type="text"/><?php ');//注意最后保留一个空格即可,否则解析成<?php?>就不对了,<?php ?>才正确
    ?>
      

  14.   

    晕死,也不准确,待有空好好研究下eval的原理。
      

  15.   

    基本上需要注意就是,出现在最后位置的<?php需要;结束
      

  16.   

    我测试了,觉得加<?php 是没问题的,就是因为ob_start的原因早就错误
    <?php
    echo eval('?>'.'<?php echo "hello world" ?>'.'<?php ');
    ?>
    这个没有问题,你说这是为什么呢
    ob_start到底还有什么内容呢? foolbirdflyfirst ?
      

  17.   

    也不是ob_start的问题,是php解析的问题,以下的例子是没错的。
    <?php
    function _eval($content)
    {
    eval('?' . '>' . $content);

    _eval('<input type="text"/><?php echo "hello world"?><input type="text"/><?php ');
    ?>
    还有就是我忽略了个问题,由于php.ini内short_open_tag的设置,eval php闭合标签都会出现不同,on的情况可解析短标签<? ?>以及<?php ?>,off的情况只能支持标准的<?php ?>
    以上例子改一下
    <?php
    function _eval($content)
    {
    eval('?' . '>' . $content);

    _eval('<input type="text"/><?php echo "hello world"?><input type="text"/><?php');//把最后的空格去掉,php.ini内设置short_open_tag为off,可以发现不同。如果short_open_tag 为on,这一句就会解析错误。
    ?>
    关于原因,只能大胆猜想php的eval实现是不太严谨的.
    举个例子,在short_open_tag为on的情况下。
    <?php
    eval('?><?php');
    ?>
    解析错误 为什么呢?对于eval内部的<?php,因为后面没有空格或者分号,eval就没有把<?php当成一个标签整体,而是首先解析<?短标签,再解析php
    验证例子
    <?php
    function php(){echo 1;}
    eval('?><?php();');
    ?>
    输出是1,实际上就是<?php?><? php();?>这么一个解析过程。
    倘若是short_open_tag为on的情况,则上例会输出<?php() 因为<?php与()并没有隔开,eval没有把<?php当成个标签整体,所以选择了把<?php()作为个字符串输出。
    结论就是 
    eval(内部出现的<?php出现在字符串最后面时,其后尽量带个空格或者;号);
      

  18.   

    sorry,没打草稿。
    =====================================================================
    倘若是short_open_tag为off的情况,则上例会输出 <?php() 因为 <?php与()并没有隔开,eval没有把 <?php当成个标签整体,所以选择了把 <?php()作为个字符串输出。 
      

  19.   

    好咧感谢湖水清澈的foolbirdflyfirst ,结贴,回家慢慢体会
      

  20.   

    再修正下:short_open_tag为on的情况下
    ==========================================================
    结论为:
    eval(内部出现的 <?php出现在字符串最后面时,其后尽量带个空格或者;号); short_open_tag为off的情况下
    ===============================================================
    结论为:
    eval(内部出现的 <?php出现在字符串最后面时,其后尽量带个空格,如果是分号须与<?php标签隔开); 考虑一下这个简单例子
    <?php
    eval('?><?php;');
    ?>