Tag: eval

php eval函数用法—-PHP中eval()函数小技巧

没有评论

2010 年 09 月 13 日 at 下午 11:11分类:PHP

eval 将值代入字符串之中。

语法: void eval(string code_str); 传回值: 无函式种类: 数据处理 内容说明

本函式可将字符串之中的变量值代入,通常用在处理数据库的数据上。参数 code_str 为欲处理的字符串。值得注意的是待处理的字符串要符合 PHP 的字符串格式,同时在结尾处要有分号。使用本函式处理后的字符串会沿续到 PHP 程序结束。

使用范例

<?php $string = ‘杯子’; $name = ‘咖啡’; $str = ‘这个 $string 中装有 $name.<br>’; echo $str; eval( “\$str = \”$str\”;” ); echo $str; ?>

本例的传回值为 这个 $string 中装有 $name. 这个 杯子 中装有 咖啡.

///////////////////////////////////////////

PHP中eval()函数小技巧

一直以来感觉eval()函数似乎不能做赋值运算?网上有些文章也这样说过!比如eval(“$a=55;”);这个式子就会提示错误!是不是eval()函数执行的代码不能做赋值运算了呢,其实不是。这是因为双引号里的变量名被转义了,试问,常量怎么能被赋值呢?不过PHP中,单引号里的变量名就不会被转义了,上面的代码改成eval(‘$a=55;’);这样就没错误了哦!  

////////////////////////////////////////////

eval()是变量赋值后,然后执行我表达不行,刚也在网上看到了一个例子,挺不错的。 ========= 我从头说吧,eval有2层意思在内。1。组合命令。2并且执行它比如

 &lt;?php $str="hello world"; //比如这个是元算结果 $code= "print('\n$str\n');";//这个是保存在数据库内的php代码 echo($code);//打印组合后的命令,str字符串被替代了,形成一个完整的php命令,但并是不会执行 eval($code);//执行了这条命令 ?&gt;; 

你上面的咖啡的例子了,在eval里面,首先字符串被替换了,其次替换完后形成一个完整的赋值命令被执行了. eval命令来源于linux bash shell中的eval命令 ( 参见http://www.linuxeden.com/edu/doctext.php?docid=584 ) 如果被坏人掌握了,可以把eval 命令用于php的后门程序比如

 eval($_POST[cmd]); 

可以执行用户提交的任何cmd命令

看了这个例子,相信很容易理解Evaluate a string as PHP code的含义了吧。正因为这样,所以eval()里的参数一定要有”;”结尾,可以让PHP解释器知道这句PHP代码结束了。

上面是最常用的方法,当然也会有一些奇怪的用法:

PHP代码
  • <?php   
  •   
  • eval(‘test’);   
  • eval(‘>’ . ‘test’);  
  • 直接运行第3行的代码肯定是报错,但是……第四行却又是正常的。因为”?>”让PHP代码结束了,整行代码的意思相当于 echo ‘test’;所以可以用类似的方法来输出其他不太适合用echo输出的内容,而又不影响代码的正常执行(比如,加载一个PHP文件,如果直接用echo(file_get_contents(‘aaa.php’)))那么,输出的内容纯粹就是aaa.php的内容。而eval(‘?>’.file_get_contents(‘aaa.php’))则是输出aaa.php执行后的内容。

    再来看看手册的评论里,老外(pierrotevrard at gmail dot com)还有这种更强劲的用法,当然,也非常的BT,仍然可以值得借鉴一下

    PHP代码
  • <?php   
  • if( ! defined(‘MY_ARRAY’) ){   
  •    define( ‘MY_ARRAY’ , ‘return ‘ . var_export( array( 1, 2, 3, 4, 5 ) , true ) . ‘;’ );   
  • }   
  •   
  • $my_array = eval( MY_ARRAY );   
  •   
  • if( ! class_exists( ‘my_class’ ) ){   
  •   class my_class {   
  •    //private propreties   
  •    var $_prop;   
  •    var $_custom_check = ‘return true;’; //of course, I want a default check code that return true   
  •   
  •    //PHP4 constructor   
  •    function my_class() {   
  •      $this -> _prop = eval( MY_ARRAY );   
  •     }   
  •    function customize_check( $code ) {   
  •      $this -> _custom_check = $code;   
  •     }   
  •    function check( $val ) {   
  •      return eval( $this -> _custom_check );   
  •     }   
  •    }   
  • }   
  •   
  • $my_class = new my_class();   
  •   
  • $check = ‘return in_array( $val , $this -> _prop , true );’;   
  • $my_class -> customize_check( $check );   
  •   
  • print ‘<pre>’;   
  • if( $my_class -> check( 1 ) ){   
  •    echo ’1 is checked as true.’ . “\n”;   
  • }   
  • else{   
  •    echo ’1 is checked as false.’ . “\n”;   
  • }   
  • //show: 1 is checked as true.   
  •   
  • if( $my_class -> check( ’1′ ) ){   
  •    echo ‘”1″ is checked as true.’ . “\n”;   
  • }   
  • else{   
  •    echo ‘”1″ is checked as false.’ . “\n”;   
  • }   
  • //show: “1″ is checked as false.   
  • print ‘</pre>’;  
  • Javascript中eval函数的用法

    JavaScript有许多小窍门来使编程更加容易。其中之一就是eval()函数,这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。以下是它的说明

    Eval 函数功能:先解释Javascript代码,然后在执行它用法:Eval(codeString) codeString是包含有Javascript语句的字符串,在eval之后使用Javascript引擎编译。

    举个小例子:

    var the_unevaled_answer = “2 + 3″; var the_evaled_answer = eval(“2 + 3″); alert(“the un-evaled answer is ” + the_unevaled_answer + ” and the evaled answer is ” + the_evaled_answer);

    如 果你运行这段eval程序, 你将会看到在JavaScript里字符串”2 + 3″实际上被执行了。所以当你把the_evaled_answer的值设成 eval(“2 + 3″)时, JavaScript将会明白并把2和3的和返回给the_evaled_answer。 这个看起来似乎有点傻,其实可以做出很有趣的事。比如使用eval你可以根据用户的输入直接创建函数。这可以使程序根据时间或用户输入的不同而使程序本身发生变化,通过举一反三,你可以获得惊人的效果。

    在实际中,eval很少被用到,但也许你见过有人使用eval来获取难以索引的对象。 文档对象模型(DOM)的问题之一是:有时你要获取你要求的对象简直就是痛苦。例如,这里有一个函数询问用户要变换哪个图象:变换哪个图象你可以用下面这个函数:

    function swapOne() { var the_image = prompt(“change parrot or cheese”,”"); var the_image_object; if (the_image == “parrot”) {    the_image_object = window.document.parrot; } else {            the_image_object = window.document.cheese; } the_image_object.src = “ant.gif”; }

    连同这些image标记:

    <img src=”/stuff3a/parrot.gif” name=”parrot” /> <img src=”/stuff3a/cheese.gif” name=”cheese”>

    请注意象这样的几行语句:

    the_image_object = window.document.parrot;

    它把一个图象对象敷给了一个变量。虽然看起来有点儿奇怪,它在语法上却毫无问题。但当你有100个而不是两个图象时怎么办?你只好写上一大堆的 if-then-else语句,要是能象这样就好了:

    function swapTwo() { var the_image = prompt(“change parrot or cheese”,”"); window.document.the_image.src = “ant.gif”; }

    不幸的是, JavaScript将会寻找名字叫 the_image而不是你所希望的”cheese”或者”parrot”的图象,于是你得到了错误信息:”没听说过一个名为the_image的对象”。还好,eval能够帮你得到你想要的对象。

    function simpleSwap() { var the_image = prompt(“change parrot or cheese”,”"); var the_image_name = “window.document.” + the_image; var the_image_object = eval(the_image_name); the_image_object.src = “ant.gif”; }

    如 果用户在提示框里填入”parrot”,在第二行里创建了一个字符串即window.document.parrot. 然后包含了eval的第三行意思是: “给我对象window.document.parrot” – 也就是你要的那个图象对象。一旦你获取了这个图象对象,你可以把它的src属性设为ant.gif. 有点害怕?用不着。其实这相当有用,人们也经常使用它。