За последние 24 часа нас посетили 22943 программиста и 1238 роботов. Сейчас ищут 762 программиста ...

Почему это работает?

Тема в разделе "PHP для новичков", создана пользователем Васяня, 25 окт 2016.

  1. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Наткнулся вот на какой камень:
    PHP:
    1. $s = 'String 0';
    2. $s++;
    3. echo $s; // 'String 1'
    4.  
    5. $s = 'String a';
    6. $s++;
    7. echo $s; // 'String b'
    Почему? Где прочитать с чем связанно данное поведение?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Есть таблица ASCII, по идее строка это набор номеров из этой таблицы, вот ты и увеличиваешь её
     
  3. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    @denis01 А как быть с этим?
    PHP:
    1. $s = 'String 099';
    2. $s++;
    3. echo $c; // String 100
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Васяня нравится это.
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Васяня это не математика, это специальный алгоритм работы со строками. Just for fun.
     
    Васяня нравится это.
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    К слову о just for fun, вспомнилось:

    Код (Text):
    1. var_dump(in_array(0, ['hello world!'])); // true
     
    Васяня и [vs] нравится это.
  7. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
  8. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  9. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    @romach Ох и странно это, не когда с подобной фигней не сталкивался. Эдакие баго-фичи.
     
  10. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    @Васяня это последствие динамической типизации, пых пытается привести строку к числу или наоборот, число к строке и продолжить работу, словно так оно и должно быть. В теории - это удобно, на практике тянет за собой трудноуловимые косяки. Потому везде где только можно, нужно стремиться к строгой типизации, благо в седьмой версии возможности для этого появились:
    https://php.ru/manual/functions.arguments.html
    https://php.ru/manual/functions.returning-values.html
     
  11. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    @romach Я пробовал этим пользоваться, не удобно. Нельзя указать несколько типов string|int, нельзя указывать типы замыканий как в TypeScript (string $var) => void, нельзя типизировать массивы ['var' => string, 'var2' => int].

    Пхп ещё рости и рости до строгой типизации. Указание типа для простых ситуаций не чего не решает, а для сложных пхп пока не может.
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    потому что он для другого, просто надо использовать несколько разных языков
     
  13. Mихалыч

    Mихалыч Новичок

    С нами с:
    12 окт 2016
    Сообщения:
    4
    Симпатии:
    0
    Все очень просто.
    РНР при выполнении арифм. операций со стоками пытается преобразовать их в числа.
    А при выводе результата - к исходному типу.

    $s = 'String 099';
    $s++;
    echo $c; // String 100

    а что такое переполнение он не знает.

    $s = 'String 99';
    $s++; // плюс в конец
    echo $s; // String 00

    по-этому

    $s = '0 String';
    $s++;
    echo $s; // 0 String