Если вы изучили все другие варианты и абсолютно уверены, что единственный способ достичь ваших целей - это определить пользовательские функции во время выполнения, используя код в строке, у вас есть две альтернативы использованию create_function
.
Быстрое решение состоит в том, чтобы просто использовать eval
:
function create_custom_function($arguments, $body) {
return eval("return function($arguments) { $body };");
}
$myFunct = create_custom_function('$user', 'echo "Hello " . $user;');
$myFunct('John Doe');
// Hello John Doe
Однако, eval()
можно отключить.Если вам нужна такая функциональность даже на серверах, где eval
недоступен, вы можете использовать eval для бедняка: записать функцию во временный файл и затем включить ее:
function create_custom_function($arguments, $body) {
$tmp_file = tempnam(sys_get_temp_dir(), "ccf");
file_put_contents($tmp_file, "<?php return function($arguments) { $body };");
$function = include($tmp_file);
unlink($tmp_file);
return $function;
}
$myFunct = create_custom_function('$user', 'echo "Hello " . $user;');
$myFunct('John Doe');
// Hello John Doe
Честно говоряТем не менее, я настоятельно рекомендую против этих подходов и предлагаю вам найти другой способ достичь своей цели.Если вы создаете собственный обфускатор кода, вам, вероятно, лучше создать расширение php, в котором код де-обфусцируется перед выполнением, аналогично тому, как работают ionCube Loader и Zend Guard Loader.