функция сломалась после обновления PHP

1

У меня есть небольшая проблема с функцией, которая, похоже, не полностью работает в новой версии php, и я получаю

Примечание. Смещение смещения строки произошло в D:\xampp\htdocs\decode\bencoded.php в строке 266
Примечание. Смещение смещения строки произошло в D:\xampp\htdocs\decode\bencoded.php в строке 270

Вот моя функция:

function bdecode($s, &$pos=0) {
  if($pos>=strlen($s)) {
    return null;
  }
  switch($s[$pos]){
  case 'd':
    $pos++;
    $retval=array();
    while ($s[$pos]!='e'){
      $key=bdecode($s, $pos);
      $val=bdecode($s, $pos);
      if ($key===null || $val===null)
        break;
      $retval[$key]=$val;
    }
    $retval["isDct"]=true;
    $pos++;
    return $retval;

  case 'l':
    $pos++;
    $retval=array();
    while ($s[$pos]!='e'){
      $val=bdecode($s, $pos);
      if ($val===null)
        break;
      $retval[]=$val;
    }
    $pos++;
    return $retval;

  case 'i':
    $pos++;
    $digits=strpos($s, 'e', $pos)-$pos;
    // Proger_XP: changed (int) -> (float) to avoid trimming of values exceeding
    //            signed int max value (2147483647).
    $val=(float)substr($s, $pos, $digits);
    $pos+=$digits+1;
    return $val;

//  case "0": case "1": case "2": case "3": case "4":
//  case "5": case "6": case "7": case "8": case "9":
  default:
    $digits=strpos($s, ':', $pos)-$pos;
    if ($digits<0 || $digits >20)
      return null;
    $len=(float)substr($s, $pos, $digits);
    $pos+=$digits+1;
    $str=substr($s, $pos, $len);
    $pos+=$len;
    //echo "pos: $pos str: [$str] len: $len digits: $digits\n";
    return (string)$str;
  }
  return null;
}

Я понимаю, что я получаю предупреждение в новом php, но я понятия не имею, как его исправить.

строка 266 (до случая 'd'): переключатель ($ s [$ pos]) {

строка 270 (после случая "1"): while ($ s [$ pos]! = 'e') {

  • 0
    хорошо мой плохой я изменил название. я принимаю любые предложения
  • 0
    И есть небольшая причина, по которой код PHP3 / 4 не будет работать на PHP5. Заметьте, это не совсем другой язык; и пример кода (публикация его вне сайта в любом случае запрещена) довольно низкоуровневый и вряд ли делает что-то причудливое. Вам лучше просто выяснить, что он должен был сделать, и переписать это еще.
Показать ещё 5 комментариев
Теги:
warnings

1 ответ

1
Лучший ответ

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

// Report all errors except E_NOTICE
error_reporting(E_ALL ^ E_NOTICE);

Вы можете сделать это, если вы уверены, что код всегда возвращает правильный результат, и уведомление не имеет значения.

Почему уведомление отображается?

Насколько я вижу, уведомление отображается, потому что вы пытаетесь получить доступ к строкам, смещенным не целым числом, а значением поплавка.

Ключевыми строками вашего кода являются следующие:

$len=(float)substr($s, $pos, $digits);
$pos+=$digits+1;
$str=substr($s, $pos, $len);
$pos+=$len;

$len вызывается для float и добавляется к $pos. Результат состоит в том, что $pos преобразуется в float после этого. Нет проблем. Но вы получите уведомление, если позже вы используете $pos для доступа к смещению вашей строки, потому что это больше не целое число:

//line 266 (before case 'd'): 
switch($s[$pos]){

//line 270 (after case '1'): 
while ($s[$pos]!='e'){

возможно, вы хотите решить его, переведя $pos в int explecit следующим образом:

//line 266 (before case 'd'): 
switch($s[(int)$pos]){

//line 270 (after case '1'): 
while ($s[(int)$pos]!='e'){

Результат вашей функции должен быть одинаковым, и уведомление должно исчезнуть.

  • 0
    большое Вам спасибо. задача решена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню