рефакторинг — рефакторинг create_function

Я пытаюсь сделать рефакторинг некоторого кода, как показано ниже (их гораздо больше):

    $smcFunc += array(
'entity_fix' => create_function('$string', '
$num = substr($string, 0, 1) === \'x\' ? hexdec(substr($string, 1)) : (int) $string;
return $num < 0x20 || $num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num == 0x202E ? \'\' : \'&#\' . $num . \';\';'),

'htmlspecialchars' => create_function('$string, $quote_style = ENT_COMPAT, $charset = \'ISO-8859-1\'', '
global $smcFunc;
return ' . strtr($ent_check[0], array('&' => '&amp;')) . 'htmlspecialchars($string, $quote_style, ' . ($utf8 ? '\'UTF-8\'' : '$charset') . ')' . $ent_check[1] . ';'),

'htmltrim' => create_function('$string', '
global $smcFunc;
return preg_replace(\'~^(?:[ \t\n\r\x0B\x00' . $space_chars . ']|&nbsp;)+|(?:[ \t\n\r\x0B\x00' . $space_chars . ']|&nbsp;)+$~' . ($utf8 ? 'u' : '') . '\', \'\', ' . implode('$string', $ent_check) . ');'),

'strlen' => create_function('$string', '
global $smcFunc;
return strlen(preg_replace(\'~' . $ent_list . ($utf8 ? '|.~u' : '~') . '\', \'_\', ' . implode('$string', $ent_check) . '));'),

// ...
);

Таким образом, для entity_fix Я сделал:

'entity_fix' => function($string) use ($num) {
$num = 0 === strpos($string, 'x') ? hexdec(substr($string, 1)) : (int) $string;
return $num < 0x20 || $num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num == 0x202E
? ''
: '&#' . $num . ';';
},

но я получаю:
Undefined variable: num что логично.
Итак, возможно ли реорганизовать этот массив (smcFunc) без полного рефакторинга использования?

0

Решение

Попробуйте определить функцию без use() языковая конструкция. $num определяется в функции и не нуждается в наследовании вне области действия функции.

'entity_fix' => function($string) {
$num = 0 === strpos($string, 'x') ? hexdec(substr($string, 1)) : (int) $string;
return $num < 0x20 || $num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num == 0x202E
? ''
: '&#' . $num . ';';
},
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]