Наткнулся вот на какой камень: PHP: $s = 'String 0'; $s++; echo $s; // 'String 1' $s = 'String a'; $s++; echo $s; // 'String b' Почему? Где прочитать с чем связанно данное поведение?
Пример #1 Арифметические операции с символьными переменными https://secure.php.net/manual/ru/language.operators.increment.php
@Васяня это последствие динамической типизации, пых пытается привести строку к числу или наоборот, число к строке и продолжить работу, словно так оно и должно быть. В теории - это удобно, на практике тянет за собой трудноуловимые косяки. Потому везде где только можно, нужно стремиться к строгой типизации, благо в седьмой версии возможности для этого появились: https://php.ru/manual/functions.arguments.html https://php.ru/manual/functions.returning-values.html
@romach Я пробовал этим пользоваться, не удобно. Нельзя указать несколько типов string|int, нельзя указывать типы замыканий как в TypeScript (string $var) => void, нельзя типизировать массивы ['var' => string, 'var2' => int]. Пхп ещё рости и рости до строгой типизации. Указание типа для простых ситуаций не чего не решает, а для сложных пхп пока не может.
Все очень просто. РНР при выполнении арифм. операций со стоками пытается преобразовать их в числа. А при выводе результата - к исходному типу. $s = 'String 099'; $s++; echo $c; // String 100 а что такое переполнение он не знает. $s = 'String 99'; $s++; // плюс в конец echo $s; // String 00 по-этому $s = '0 String'; $s++; echo $s; // 0 String