Ошибка оператора уменьшения для строк в PHP?

#php #string #increment #decrement

#php #строка #увеличить #уменьшение

Вопрос:

Существует несоответствие в функции оператора увеличения / уменьшения в отношении строк, по крайней мере, в моей версии 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
  

Это ожидаемое поведение? Должен ли я подать отчет об ошибке или что-то в этом роде? Знаете ли вы об обходном пути?

редактировать: ошибка # 80212

Комментарии:

1. Почему вы должны увеличивать или уменьшать строки?

2. Предполагается, что операторы увеличения / уменьшения работают только с типами, имеющими одно числовое значение. Меня больше удивляет, что in the increment работает дальше 'abc12' . Вопрос Маркуса оправдан. Почему вы ожидаете, что сможете увеличивать / уменьшать нечисловое значение таким образом?

3. Согласно руководству : «Операторы увеличения / уменьшения влияют только на числа и строки. Массивы, объекты, логические значения и ресурсы не затрагиваются. Уменьшение нулевых значений тоже не имеет никакого эффекта, но их увеличение приводит к 1. » Мой фактический вариант использования — для управления версиями пространства имен..

4. Я понимаю, что вы используете тип «string» в самом широком смысле, но это не оправдано. Как бы вы увеличили строку, например, «Wonderful»? Вы не можете, потому что это никоим образом не числовое значение. Значит, мы, вероятно, можем согласиться с тем, что не все строки будут работать?

5. Ха-ха, ну вот и все. Да, я согласен, что в руководстве не все так ясно.

Ответ №1:

Это документированное поведение (курсив мой):

PHP следует соглашению Perl при работе с арифметическими операциями над символьными переменными, а не C. Например, в PHP и Perl $ a = ‘Z’; $ a ; превращает $ a в ‘AA’, в то время как в C a = ‘Z’; a ; превращает a в ‘[‘ (значение ASCII ‘Z’ равно 90, значение ASCII ‘[‘равно 91). Обратите внимание, что символьные переменные можно увеличивать, но не уменьшать, и даже в этом случае поддерживаются только простые ASCII-алфавиты и цифры (a-z, A-Z и 0-9). Увеличение / уменьшение других символьных переменных не имеет никакого эффекта, исходная строка остается неизменной.

Комментарии:

1. Согласно текущему статусу моего отчета об ошибке , «это важное примечание должно быть более заметным». И это все еще сбивает с толку непоследовательность.

Ответ №2:

Вот что я, наконец, сделал:

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

Я бы не назвал это элегантным, но я бы назвал это функциональным.