PHP: Массив к переменным значениям параметра функции

Примите во внимание, что использование WaitForSingleObject может получить Вас в проблему в этом сценарии. Следующее отрезано от подсказки относительно моего веб-сайта:

проблема возникает, потому что Ваше приложение имеет окно, но не качает сообщения. Если порожденное приложение вызовет SendMessage с одной из широковещательных целей ( HWND_BROADCAST или HWND_TOPMOST), то SendMessage не возвратится к новому приложению, пока все приложения не обработали сообщение - но Ваше приложение не может обработать сообщение, потому что это не качает сообщения...., таким образом, новое приложение запирается, таким образом, Ваше ожидание никогда не успешно выполняется.... МЕРТВАЯ БЛОКИРОВКА.

, Если Вы имеете неограниченный контроль над порожденным приложением, тогда существуют меры, которые можно принять, такие как использование SendMessageTimeout, а не SendMessage (например, для инициирования DDE, если кто-либо все еще использует это). Но существуют ситуации, которые вызывают неявные широковещательные сообщения SendMessage, над которыми Вы не имеете никакого контроля, такого как использование SetSysColors API, например.

единственные безопасные окольные пути это:

  1. отделяет Ожидание в отдельный поток, или
  2. используют тайм-аут на Ожидании и используют PeekMessage в Вашем Цикле ожидания, чтобы гарантировать, чтобы Вы накачали сообщения, или
  3. используют MsgWaitForMultipleObjects API.
14
задан Sinan Ünür 26 November 2009 в 03:32
поделиться

2 ответа

Да, используйте call_user_func_array () :

call_user_func_array('function_name', $parameters_array);

Вы также можете использовать это для вызова методов в классе:

class A {
  public function doStuff($a, $b) {
    echo "[$a,$b]\n";
  }
}

$a = new A;
call_user_func_array(array($a, 'doStuff'), array(23, 34));
27
ответ дан 1 December 2019 в 12:01
поделиться

Вы можете использовать eval :

  eval("$func_name(" . implode($params, ",") . ");");

Хотя вам, возможно, придется проделать некоторые уловки лямбда, чтобы ваши параметры цитировались и / или экранировались:

  $quoted_escaped_params = array_map(create_function('$a', 'return "\"". str_replace("\"",` "\\\"", $a) . "\""'), $params);
-2
ответ дан 1 December 2019 в 12:01
поделиться