2012-06-18 22 views
0

这里有一个功能,我修改了一点解码bencoded文件。PHP中的静态函数仅有时会返回一个错误(Illegal Offset Type)?

# decode a bencoded string 
public static function decode($s, &$pos = 0) { 
    if($pos >= strlen($s)) { 
     return false; 
    } 
    switch($s[$pos]) { 
     case 'd': 
      ++$pos; 
      $retval = array(); 
      while(isset($s[$pos]) && $s[$pos] != 'e') { 
       $key = self::decode($s, $pos); 
       $val = self::decode($s, $pos); 
       if($key == false || $val == false) { 
        break; 
       } 
       $retval[$key] = $val; // ERROR OCCURES HERE 
      } 
      $retval['isDct'] = true; 
      ++$pos; 
      return $retval; 
     case 'l': 
      ++$pos; 
      $retval = array(); 
      while(isset($s[$pos]) && $s[$pos] != 'e') { 
       $val = self::decode($s, $pos); 
       if($val == false) { 
        break; 
       } 
       $retval[] = $val; 
      } 
      ++$pos; 
      return $retval; 
     case 'i': 
      ++$pos; 
      $digits = strpos($s, 'e', $pos) - $pos; 
      $val = (int)substr($s, $pos, $digits); 
      $pos += $digits + 1; 
      return $val; 
     default: 
      $digits = strpos($s, ':', $pos) - $pos; 
      if($digits < 0 || $digits > 20) { 
       return false; 
      } 
      $len = (int)substr($s, $pos, $digits); 
      $pos += $digits + 1; 
      $str = substr($s, $pos, $len); 
      $pos += $len; 
      return (string)$str; 
    } 
    return false; 
} 

你会注意到我已经评论了错误发生的地方;

Illegal offset type

我不知道这是怎么发生,虽然作为分配$retval[$key] = $val之前我检查,看看是否任一值是假的第一和如果再从switch语句打破。

就像我说过的,这只发生在解码经过编码的字符串时每50次尝试一次。

任何人都知道如何解决这个问题或者是什么原因造成的?

回答

2

$key必须是一个字符串(或能够被玩弄成一个)。任何其他类型,它会抛出该错误。你正在检查bool false这是好的,但它也可能是true, null, object, array

+0

感谢这一点,我只是假设,因为该函数只能返回'假',那就是它可能是因为它是递归地调用。 – Griff

+0

@Mike B +1为头像!战争从未改变! –

相关问题