问一个很蛋疼的问题!

水平凡 发布于 2013/05/15 09:38
阅读 325
收藏 0
PHP

比如程序接收到一个值,保存到 $str 里面。现在呢,为了灵活使用,会支持用户调用自定义函数,对这个值进行处理返回。

比如用户可以输入:str_replace|'郁闷','',### 这样的形式调用 str_replace这个函数,“|”后面就是对应的str_replace参数,###将被替换成变量 $str 。

我的做法是先取出 str_replace 保存到变量 $fun = 'str_replace';然后呢,对 '郁闷','',### 这部分的 ###进行替换成 $str 保存到 $art。 接着就 $fun($art) 发现会出问题,报一个错误:Wrong parameter count for 类似这样的错误!!

请问这种怎么解决?不想把组合的代码生成一个Php文件然后引入执行,也不能用eval函数!

加载中
0
王瑞平
王瑞平
参数个数不对,$art打印出来,检查字串
王瑞平
王瑞平
@水平凡 '郁闷','','".$str."'
王瑞平
王瑞平
@水平凡 应该是,'".str."'"
水平凡
水平凡
$art 打印出来是正确的! '郁闷','',$str
0
deleted
deleted

你这种做法很不可靠

建议用serialize/unserialize + call_user_func_array做

别忘记弄个沙盒函数滤一下入口

水平凡
水平凡
可靠不可靠先不说,现在先把功能能实现!你说的我也用那个试过,但是也会出那个问题、
0
deleted
deleted

你确信会出问题?


<?php
$function = 'str_replace';
$params = array('hello', '好');
$data = serialize(array($function, $params));
list($function, $params) = unserialize($data);
$params[] = "hello world";
echo call_user_func_array($function, $params),"\n";



为什么说拼接字符串不可取? 因为你无法确保用户输入数据里不带你定义的分隔符, 当你实现一整套词法解析用来避免冲突问题后, 你已经实现了一个serialize/unserialize了。。。
当然,其他方案也有,比如首字节定义参数数量,接下来用定长字节数标记offset,接着填充数据, 不过, 比起serialize/unserialize,定义一套协议不是麻烦一点半点啊.


0
sam_ai
sam_ai
你这个不就成了搞rpc了么,我建议是用xmlwebservice,总之呢实用为主,米有必要重复制造轮子。
返回顶部
顶部