Я всегда думал, что $i++ работает как $i = $i+1; Интересно, как тогда происходит инкремент? Если он выдает такое.
Так это ясно. Учитывая что получается когда мы пишем $i++ это не есть $i = $i+1; получается $i++; работает как то по другому? В случае Код (PHP): $i = false; $i = $i + 1; //тут срабатывает приведение типо false засчитывается как ноль и в итоге получаем 1. Хочется понять как конкретно работает инкремент
Блин, инкремент - это не краткая запись присвоения после работы оператора сложения с единичкой. Краткая запись бинарного оператора + с присвоением это += $i= $i+1; идентично $i+=1; А инкремент и декремент - это самостоятельный унарный оператор. Не краткая запись. Как он работает - описано в документации. Как он устроен изнутри, ты можешь глянуть в исходниках PHP.
Ты все рассказал, но так и не получил ответа по вопросу. Ну то что он возвращает значение а потом увеличивает мне ясно. вопрос: Если никто не подскажет, наверно придется туда лезть и смотреть.
Кратко: Код (Text): $str = 'x'; $str += 1; var_dump($str); $str = 'x'; $str++; var_dump($str); Долго: инкремент/декремент присваивает переменной следующее/предыдущее значение, не меняя тип. У значений булева типа нет приоритетов. А если бы был, то цикл быстро бы уперся в тупик. Барабум, эта прекрасная логика крашится об такие значения переменных: Код (Text): $str = ''; // превращается в string (!!!) "1". При повторном инкременте, превращается в int "2". $str = '0'; // превращается в int "1" $str = null; // превращается в int "1", хотя null должен быть полноценным типом с единственным значением и никакого инкремента быть не может Ну по крайней мере, курсив - верен. Все ведь знали, как перебрать алфавит в цикле?
До сегодняшнего дня я не знал что можно применить оператор инкремента к символам. Код (PHP): $j = "a"; for($i = 0; $i < 26; $i++){ echo $j++."<br>"; }
Код (PHP): $j = TRUE; echo ++$j . "<br>"; var_dump($j); //вывод //1 //bool(true) $j = NULL; echo ++$j . "<br>"; var_dump($j); //вывод //1 //int(1) Почему так? Добавлено спустя 1 минуту 17 секунд: Но почему, нет ответа. Добавлено спустя 2 минуты 13 секунд: Код (PHP): $j = TRUE; echo ++$j . "<br>"; echo ++$j . "<br>"; var_dump($j); //вывод //1 //1 //bool(true) $j = NULL; echo ++$j . "<br>"; echo ++$j . "<br>"; var_dump($j); //вывод //1 //2 //int(2) ДА, на boolean инкремент не влияет.
Потому что огурцы, и разрабы пыха прошляпили, а потом было лень исправлять. Поглядели, что в JS все еще печальнее с нулевыми типами, и решили, что у них вполне себе радуга.
count считает количество элементов в передаваемой переменной. Если это массив или объект, будет возвращено количество их содержимого. Если просто одиночная переменная - будет возвращено 1. Это же не сишный size, показывающий, сколько байт под указателем лежит. Тут вполне логично все. И да, а что ты там ожидал увидеть?
count также считает, что - то в объектах. От суда и вывод: переменная является объектом, по этому и считает.
Воу воу воу, палехчи, переменная это переменная. Объектов она не является, тут у нас не JS. Просто count возвращает количество чего-то переданного, пытаясь привести его к структуре. Переменная - структура из одного элемента для него. В тех же плюсах и шарпах, функции size работают со всем, что им передашь, точно так же. В плюсах вообще она возвращает размер блока памяти, занимаемого переменной. Чтобы длину массива посчитать, нужно длину блока памяти разделить на размер типа массива с учетом битности системы, если работаешь без выравнивания. Все ок.