在 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 ) 测试分配了 true 和 false布尔值,将失败并且 if-then 语句中的代码块将执行,即使它们不应该执行。当我将这些更改为 if( retrim === true ) 并更改为 mb_substr 函数时,副作用停止了正在发生。
我想知道 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 ) 测试分配了 true 和 false布尔值,将失败并且 if-then 语句中的代码块将执行,即使它们不应该执行。当我将这些更改为 if( retrim === true ) 并更改为 mb_substr 函数时,副作用停止了正在发生。