Оператор декремента для ошибки строк в 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

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

редактировать: зарегистрирована bug#80212


person Stamoulohta    schedule 10.10.2020    source источник
comment
Почему вы должны увеличивать или уменьшать строки?   -  person Markus Zeller    schedule 10.10.2020
comment
Предполагается, что оператор увеличения/уменьшения работает только с типами, имеющими одно числовое значение. Меня больше удивляет, что в инкременте работает на 'abc12'. Вопрос Маркуса оправдан. Почему вы ожидаете, что таким образом сможете увеличивать/уменьшать нечисловое значение?   -  person KIKO Software    schedule 10.10.2020
comment
Согласно руководству: операторы увеличения/уменьшения влияют только на числа. и струны. Массивы, объекты, логические значения и ресурсы не затрагиваются. Уменьшение значений NULL также не имеет никакого эффекта, но их увеличение приводит к 1. Мой фактический вариант использования - управление версиями пространства имен.   -  person Stamoulohta    schedule 10.10.2020
comment
Я понимаю, что вы понимаете строковый тип в самом широком смысле, но это не оправдано. Как бы вы увеличили строку вроде Wonderful? Вы не можете, потому что это не числовое значение. Итак, мы, вероятно, можем согласиться с тем, что не все струны будут работать?   -  person KIKO Software    schedule 10.10.2020
comment
Вам нужно разделить ваши имена на две части. Что вы можете использовать, так это: stackoverflow.com/questions/4537994/   -  person KIKO Software    schedule 10.10.2020
comment
Спасибо, @KIKOSoftware, но Wonderfum — это доработка Wonderful. И это действительно работает. Я действительно думаю, что это ошибка или, по крайней мере, это должно быть ясно указано в руководстве.   -  person Stamoulohta    schedule 10.10.2020
comment
Ха-ха, ну вот. Да, я согласен, что в руководстве не все так ясно.   -  person KIKO Software    schedule 10.10.2020
comment
@MarkusZeller Буквенно-цифровые последовательности - это вещь. Подумайте об автомобильных номерах или столбцах электронных таблиц.   -  person Álvaro González    schedule 12.10.2020
comment
@ ÁlvaroGonzález Тогда должно быть уникальное правило, чтобы числа были в начале или в конце строки. Лучше разделите их и сделайте вручную.   -  person Markus Zeller    schedule 12.10.2020
comment
@MarkusZeller Ну, инструменту не обязательно охватывать все варианты использования, чтобы заслужить существующий ????   -  person Álvaro González    schedule 12.10.2020
comment
@ ÁlvaroGonzález Я не хотел бы сравнивать инструмент с языковой конструкцией.   -  person Markus Zeller    schedule 12.10.2020


Ответы (2)


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

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

person Álvaro González    schedule 12.10.2020
comment
Согласно текущему статусу моего отчета об ошибке, "это важное примечание должно быть более заметно». И все равно это ужасно противоречиво. - person Stamoulohta; 12.10.2020

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

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

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

person Stamoulohta    schedule 12.10.2020