【问题标题】:Decrement operator for strings bug in PHP?PHP中字符串错误的减量运算符?
【发布时间】:2021-01-25 05:53:41
【问题描述】:

至少在我的 PHP 版本中,关于字符串的递增/递减运算符函数存在不一致。这就是我的意思:

php > echo phpversion();
7.4.11
php > $test = 'abc12';
php > // increment works as expected
php > echo(++$test);
abc13
php > echo(++$test);
abc14
php > echo(++$test);
abc15
php > // but decrement fails
php > echo(--$test);
abc15
php > echo(--$test);
abc15
php > echo(--$test);
abc15

这是预期的行为吗?我应该提交错误报告还是什么?您知道解决方法吗?

编辑:提交bug#80212

【问题讨论】:

  • 为什么要增加或减少字符串?
  • 增量/减量运算符仅适用于具有单个数值的类型。更让我惊讶的是,在'abc12' 上的增量工作。马库斯的问题是有道理的。为什么您希望能够以这种方式增加/减少非数值?
  • 根据manual:“递增/递减运算符只影响数字和字符串。数组、对象、布尔值和资源不受影响。减少 NULL 值也没有效果,但增加它们会导致1."我的实际用例是命名空间版本控制..
  • 我知道您在最广泛的意义上采用“字符串”类型,但这并不合理。你将如何增加像“Wonderful”这样的字符串?你不能,因为它无论如何都不是数字。所以我们可能会同意并非所有字符串都可以工作?
  • 哈哈,好吧,你去。是的,我同意手册不是那么清楚。

标签: php string increment decrement


【解决方案1】:

这是我最终选择的:

function decrement($str) {
  $matches = preg_split('/(\d+)\z/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
  @--$matches[1];
  return implode($matches);
}

不会称之为优雅,但我会称之为功能

【讨论】:

    【解决方案2】:

    那是documented behaviour(强调我的):

    在处理字符变量而不是 C 的算术运算时,PHP 遵循 Perl 的约定。例如,在 PHP 和 Perl 中 $a = 'Z'; $a++;将 $a 变成 'AA',而在 C 中 a = 'Z';一个++;将 a 转换为 '['('Z' 的 ASCII 值为 90,'[' 的 ASCII 值为 91)。请注意,字符变量可以递增但不能递减,即便如此,仅支持纯 ASCII 字母和数字(a-z、A-Z 和 0-9)。其他字符变量自增/自减无效,原字符串不变。

    【讨论】:

    • 按照我bug report的现状,'这个重要的说明应该更突出'。它仍然令人费解地不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2012-12-09
    • 1970-01-01
    • 2013-09-16
    • 2012-12-19
    相关资源
    最近更新 更多