php动态生成函数示例

以下正是php动态生成函数示例,示例中用到了eval函数,小编备感生龙活虎旦服务器上同意客商运维那样的函数是至极危险的

系列化是将变量转换为可保留或传输的字符串的历程;反系列化正是在适龄的时候把这一个字符串再转形成原本的变量使用。那多个经过结合起来,可以轻巧地囤积和传输数据,使程序更具维护性。
 

复制代码 代码如下:

  1. serialize和unserialize函数
     
    那多个是系列化和反种类化PHP中数量的常用函数。
    <?php
    $a = array(‘a’ => ‘Apple’ ,’b’ => ‘banana’ , ‘c’ =>
    ‘Coconut’);
    //体系化数组
    $s = serialize($a);
    echo $s;
    //输出结果:a:3:{s:1:”a”;s:5:”Apple”;s:1:”b”;s:6:”banana”;s:1:”c”;s:7:”Coconut”;}
    echo ‘<br /><br />’;
    //反系列化
    $o = unserialize($s);
    print_r($o);
    //输出结果 Array ( [a] => Apple [b] => banana [c] =>
    Coconut )
    ?>
    当数组值包括如双引号、单引号或冒号等字符时,它们被反连串化后,大概会现出难题。为了征服那么些标题,三个异彩纷呈的技艺是选择base64_encode和base64_decode。
    $obj = array();
    //序列化
    $s = base64_encode(serialize($obj));
    //反种类化
    $original = unserialize(base64_decode($s));
    不过base64编码将扩充字符串的尺寸。为了制伏那个难点,能够和gzcompress一齐使用。
    //定义三个用来类别化对象的函数
    function my_serialize( $obj )
    {
       return base64_encode(gzcompress(serialize($obj)));
    }
    //反体系化
    function my_unserialize($txt)
    澳门新葡萄京官网首页,{
       return unserialize(gzuncompress(base64_decode($txt)));
    }
  2. json_encode 和 json_decode
     
    选取JSON格式类别化和反系列化是三个不利的精选:
     
    使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。
    JSON格式是可读的。
    JSON格式比serialize重返数据结果小。
    JSON格式是开放的、可移植的。别的语言也能够选拔它。
    $a = array(‘a’ => ‘Apple’ ,’b’ => ‘banana’ , ‘c’ =>
    ‘Coconut’);
    //种类化数组
    $s = json_encode($a);
    echo $s;
    //输出结果:{“a”:”Apple”,”b”:”banana”,”c”:”Coconut”}
    echo ‘<br /><br />’;
    //反类别化
    $o = json_decode($s);
    在上头的例子中,json_encode输出长度比上个例子中serialize输出长度分明要短。
     
  3. var_export 和 eval
     
    var_export
    函数把变量作为多少个字符串输出;eval把字符串当成PHP代码来进行,反连串化获得开始的意气风发段时期变量的内容。
     
    $a = array(‘a’ => ‘Apple’ ,’b’ => ‘banana’ , ‘c’ =>
    ‘Coconut’);
     
    //体系化数组
     
    $s = var_export($a , true);
     
    echo $s;
     
    //输出结果: array ( ‘a’ => ‘Apple’, ‘b’ => ‘banana’, ‘c’ =>
    ‘Coconut’, 卡塔尔
     
    echo ‘<br /><br />’;
     
    //反体系化
     
    eval(‘$my_var=’ . $s . ‘;’);
     
    print_r($my_var);
  4. wddx_serialize_value 和 wddx deserialize
     
    wddx_serialize_value函数可以类别化数组变量,并以XML字符串方式出口。
     
    $a = array(‘a’ => ‘Apple’ ,’b’ => ‘banana’ , ‘c’ =>
    ‘Coconut’);
     
    //系列化数组
    $s = wddx_serialize_value($a);
    echo $s;
     
    //输出结果(查看输出字符串的源码):<wddxPacket
    version=’1.0′><header/><data><struct><var
    name=’a’><string>Apple</string></var><var
    name=’b’><string>banana</string></var><var
    name=’c’><string>Coconut</string></var></struct></data></wddxPacket>
     
    echo ‘<br /><br />’;
     
    //反种类化
    $o = wddx_deserialize($s);
    print_r($o);
    //输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut
    )
    能够看见,XML标签字符比较多,以致这种格式的系列化依然占了重重上空。
     
    小结
     
    上述全部的函数在体系化数组变量时都能平常实施,但利用到指标就不一样了。举个例子json_encode连串化对象就可以停业。反种类化对象时,unserialize和eval将有不相同的功用。

<?
$a[‘a’]=1;
$a[‘b’]=1;
$a[‘c’]=1;
$str=”function a(){global $a;if($a[‘a’]==1 && $a[‘b’]==1 &&
$a[‘c’]==1){return ‘OK’;}else{return ‘ERR’;}}”;
eval($str);
if(a()==”OK”){
 echo “GOOD”;
}else{
 echo “OH NO”;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注