Замените create_function на анонимную функцию - PullRequest
0 голосов
/ 27 апреля 2018

Я проверил это перед отправкой вопроса.

это небольшая часть кода, которая использует create_function

$lambda_functions[$code_hash] = create_function('$action, &$self, $text', 'if ($action == "encrypt") { '.$encrypt.' } else { '.$decrypt.' }');

пробовал использовать этот способ

$lambda_functions[$code_hash] = function ( $action, &$self, $text ) use ( $encrypt, $decrypt ) {
                if ($action == "encrypt") {
                    return $encrypt;
                } else {
                    return $decrypt;
                }
            };

, но не работает должным образом $encrypt или $decrypt будет содержать код, похожий на этот

$encrypt = $init_encryptBlock . '
           $ciphertext = "";
           $text = $self->_pad($text);
           $plaintext_len = strlen($text);

           $in = $self->encryptIV;

             for ($i = 0; $i < $plaintext_len; $i+= '.$block_size.') {
              $in = substr($text, $i, '.$block_size.') ^ $in;
                        '.$_encryptBlock.'
                        $ciphertext.= $in;
             }

             if ($self->continuousBuffer) {
               $self->encryptIV = $in;
             }

             return $ciphertext;
             ';

Работает нормально с create_function, но не с anonymous, не знаете, где я ошибаюсь?

1 Ответ

0 голосов
/ 27 апреля 2018

Разница в том, что с create_function() ваш код был представлен как строка и интерпретирован как код, но с анонимной функцией строка интерпретируется как строка, а не как код, который она содержит.

Вы можете просто извлечь свой код из строки, которая у вас есть в $encrypt и $decrypt. Это будет выглядеть так:

/*
 * Removed the "use ($encrypt, $decrypt)" part, 
 * because those were the strings that contained the code, 
 * but now the code itself is part of the anonymous function.
 * 
 * Instead, i added "use ($block_size)", because this is a vairable,
 * which is not defined inside of your function, but still used in it.
 * The other code containing variables might include such variables as
 * well, which you need to provide in the use block, too.
 */
$lambda_functions[$code_hash] = function ( $action, &$self, $text ) use ($block_size) {
    if ($action == "encrypt") {
        //Extract $init_encryptBlock here
        $ciphertext = "";
        $text = $self->_pad($text);
        $plaintext_len = strlen($text);

        $in = $self->encryptIV;

        for ($i = 0; $i < $plaintext_len; $i+= $block_size) {
            $in = substr($text, $i, $block_size) ^ $in;
            // Extract $_encryptBlock here
            $ciphertext.= $in;
        }

        if ($self->continuousBuffer) {
            $self->encryptIV = $in;
        }

         return $ciphertext;
    } else {
        //Extract $decrypt here
    }
};

Пожалуйста, имейте в виду, что это не полный ответ. В коде вы найдете множество // Extract $variable here комментариев, которые обозначают каждую переменную, содержащуюся в вашем коде, и которую нужно извлечь так, как я извлек код из $encrypt.

...