изменить $ _POST для разделения параметров функции в PHP - PullRequest
0 голосов
/ 18 марта 2012

Проблема легко объяснима.Я хочу создать объект, параметры и вызовы функций на основе переменных $ _POST.

$obj = new $_POST['object']['name']($_POST['object']['params']);

            return json_encode(
                 $obj->$_POST['function']['name']($_POST['function']['params'])
            );

Единственная проблема здесь в том, что он дает параметры в виде массива.И я хочу, чтобы он разделял переменные запятой, например: $obj->function($var1 , $var2, $var3);.Как мне этого добиться?

Ответы [ 5 ]

3 голосов
/ 18 марта 2012

Это можно сделать, но вы должны делать это только с использованием белого списка возможных объектов для создания. В противном случае это опасно. Система, которая открыта, не может быть хорошей идеей. Если вы можете переосмыслить проблему, это может помочь подойти к ней по-другому.

Чтобы решить вашу проблему, вы можете использовать такую ​​конструкцию:

// 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']));
  }
}
2 голосов
/ 18 марта 2012

call_user_func_array () - это то, что вы ищете.Напомним, что запуск значений $ _POST - это угроза безопасности, надеюсь, вы правильно их очистите.

2 голосов
/ 18 марта 2012

Сделайте что-то вроде этого:

call_user_func_array( array($obj, $_POST['function']['name']), $_POST['function']['params'])

Документация функции call_user_func_array

1 голос
/ 18 марта 2012

Лучший способ - создать объект без аргументов, переданных конструктору, и инициировать его другим методом.Например:

$obj = new $_POST['object']['name']();
$result = call_user_func_array(array($obj,'init'),$_POST['object']['params']);

Кроме того, в PHP 5.4+ вы можете использовать этот «хак»:

$reflection = new ReflectionClass($_POST['object']['name']);
$obj = $reflection->newInstanceWithoutConstructor();
call_user_func_array(array($obj,'__constructor'),$_POST['object']['params']);

Но я советую вам изменить свою архитектуру, чтобы вы могли пройтимассив для конструктора "как есть".

0 голосов
/ 18 марта 2012

у функции есть массив

$name = $_POST['object']['name'];

$obj = new $name;

$array = explode(',', $_POST['object']['params'];
$obj->function($array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...