在 PHP 服务器端脚本中观察变量时,X-debugger 显示意外的变化

X-debugger shows unexpected changes when watching variables in a PHP server-side script

我想知道 X-debugger and/or Apache 网络服务器是否是我刚刚开始看到的调试问题的原因。我包含以下代码以显示出现意外值的位置。

脚本代码如下:

// The value of $retrim is FALSE.
// The value of $lowValue is "Smokeymoke".
// The value of $highValue is "Te".
//  The value of $k is 1 (ONE).

while( true ) {    // The condition of the while loop isn't actually true, but is a detail
                   // that only adds complexity to this issue so isn't shown here.

    $newLowValue  = substr( $lowValue,  0, $k );     // When executed $newLowValue is
                                                     // "Smokeymoke", but should be "S"!

    if( $retrim ) {     // The value of $retrim is FALSE, so this if-then block of code
                        // isn't executed.

        $newHighValue = substr( $highValue, 0, $k );

    } // End of if( $retrim ) ...

  if( $newLowValue !== $newHighValue ) {     // However, the value of $newHightValue at
                                             // this point doesn't show "Te", but rather
                                             // "T" (!), but since the two aren't the same,
                                             // even if wrong, causes the while-loop to
                                             // exit.

      break;

  } // End of if( $newLowValue  !== $newHighValue ) ...

  ++$k;

} // End of while( true ) ...

上面代码中的 while 循环在 $newLowValue$newHighValue 不同时以 break 语句退出。否则,循环继续执行。

然而,根据显示的值,循环退出,因为 $newLowValue$newHighValue 不同,即使代码没有按照上面代码中的注释正确执行,导致值这些变量不正确。

附件显示了我在上面调试 while 循环时看到的 X-debugger 输出。

The server information from phpinfo.php -
  OS version:               Linux (CentOS) 3.10.0-514.16.1.el7.x86_64 #1
                            SMP Wed Apr 12 15:04:24 UTC 2017 x86_64
  Apache version:           Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.6.30
  X-Debugger version:       2.5.3
  PHP version:              5.6.30
  Symfony 2 version:        2.8.28 - app/dev/debug

The client is running -
  PHP Storm version:        PhpStorm 2016.3.3 Build #PS-163.13906.21, built on
                            March 8, 2017
  Chrome Browser version:   Version 75.0.3770.142 (Official Build) (64-bit)
  Windows 10 Home version:  1803 OS build 17134.885

感谢您的评论。这是我发现的问题...

我在问题中显示的数据并不清楚,但是在多字节字符串上使用 substr 的副作用是有时函数返回原始未截断的字符串,无论长度参数的值如何。从 substr 更改为 mb_substr 阻止了这种情况的发生。

此外,if( retrim ) 测试分配了 truefalse布尔值,将失败并且 if-then 语句中的代码块将执行,即使它们不应该执行。当我将这些更改为 if( retrim === true ) 并更改为 mb_substr 函数时,副作用停止了正在发生。