问题很容易解释。我想要做的是基于$ _POST变量创建一个对象,参数和函数调用。
$obj = new $_POST['object']['name']($_POST['object']['params']);
return json_encode(
$obj->$_POST['function']['name']($_POST['function']['params'])
);
这里唯一的问题是它将参数作为数组提供。我希望它用逗号分隔变量,例如:$obj->function($var1 , $var2, $var3);
。我怎样才能做到这一点?
答案 0 :(得分:3)
这可以完成,但您应该只使用要创建的可能对象的白名单来完成。否则它有点危险。这个开放的系统可能不是一个好主意。如果您可以重新考虑这个问题,可能会以不同的方式处理它。
要解决您的问题,您可以使用这样的结构:
// Possible values:
$acceptable_classes = array('myClass1', 'myClass2', 'myClass3');
// If it is an allowed class,
if (in_array($_POST['object']['name'], $acceptable_classes) {
// Store it in a variable.
$class = $_POST['object']['name'];
$obj = new $class;
}
您需要为该功能保留类似的白名单。您可以使用多维数组。您可以扩展它以保持可能功能的可接受参数。它可以很快地吹出比例,但有助于保持安全。
$acceptable_classes = array(
'myClass1' => array(
'func1', 'func2'
),
'myClass2' => array(
'func3', 'func4'
)
);
if ($acceptable_classes, array_key_exists($_POST['object']['name']) {
if (in_array($_POST['function']['name'], $acceptable_classes($_POST['object']['name'])) {
// Store it in a variable.
$class = $_POST['object']['name'];
$obj = new $class;
$func = $_POST['function']['name'];
return json_encode($obj->$func($_POST['function']['params']));
}
}
答案 1 :(得分:2)
做这样的事情:
call_user_func_array( array($obj, $_POST['function']['name']), $_POST['function']['params'])
call_user_func_array
函数的答案 2 :(得分:2)
call_user_func_array()正是您要找的。另外,运行$ _POST值是一个安全风险,我希望你能正确消毒它们。
答案 3 :(得分:1)
最好的方法是创建没有传递给构造函数的参数的对象,并使用其他方法启动它。例如:
$obj = new $_POST['object']['name']();
$result = call_user_func_array(array($obj,'init'),$_POST['object']['params']);
此外,在PHP 5.4+中,您可以使用此“hack”:
$reflection = new ReflectionClass($_POST['object']['name']);
$obj = $reflection->newInstanceWithoutConstructor();
call_user_func_array(array($obj,'__constructor'),$_POST['object']['params']);
但我建议你改变你的架构,这样你就可以“按原样”将数组传递给构造函数。
答案 4 :(得分:0)
让函数采用数组
$name = $_POST['object']['name'];
$obj = new $name;
$array = explode(',', $_POST['object']['params'];
$obj->function($array);