更新PHP后功能中断了

时间:2015-05-29 11:01:07

标签: php warnings

我的功能有点问题似乎没有完全适用于新的php版本而且我收到了

  

注意:字符串偏移转换发生在第266行的D:\ xampp \ htdocs \ decode \ bencoded.php中   注意:字符串偏移转换发生在第270行的D:\ xampp \ htdocs \ decode \ bencoded.php

这是我的功能:

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's 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行(在案例&#39; d&#39;之前):切换($ s [$ pos]){

第270行(在案例&#39; 1&#39;之后):while($ s [$ pos]!=&#39; e&#39;){

1 个答案:

答案 0 :(得分: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已投放到浮动状态并添加到$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'){

你的功能结果应该是相同的,通知应该已经消失。