#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);
}
Я бы не назвал это элегантным, но я бы назвал это функциональным.