Комментарии 27
Слабая динамическая типизация и ее глюки особенности.
Разработчик не на PHP и его предрассудки особенности.
Ну положим идею о таком инкременте не php-шники придумали.
А самой статье сильно не хватает добавки про декремент.
Т.к. даже те кто читал мануал и понимают что 'AA'++ даст 'AB' и 'Z'++ даст 'AA', не всегда понимают что 'AB'-- даст 'AB' и 'AA'-- даст 'AA';
PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in PHP and Perl $a = 'Z'; $a++; turns $a into 'AA', while in C a = 'Z'; a++; turns a into '[' (ASCII value of 'Z' is 90, ASCII value of '[' is 91).
А самой статье сильно не хватает добавки про декремент.
Т.к. даже те кто читал мануал и понимают что 'AA'++ даст 'AB' и 'Z'++ даст 'AA', не всегда понимают что 'AB'-- даст 'AB' и 'AA'-- даст 'AA';
Ну так я говорю о языках со слабой динамической типизацией вообще, а не по php конкретно.
Совершенно бессмысленно это все. Задач когда нужен инкремент строки настолько исчезающе мало, что я даже придумать не могу. А где нужен — пусть лучше будет соответствующая функция, эта задача идеологически ближе к разному кодированию/декодированию (base64, хеши и т.п.).
Совершенно бессмысленно это все. Задач когда нужен инкремент строки настолько исчезающе мало, что я даже придумать не могу. А где нужен — пусть лучше будет соответствующая функция, эта задача идеологически ближе к разному кодированию/декодированию (base64, хеши и т.п.).
Ну так я говорю о языках со слабой динамической типизацией вообще, а не по php конкретно.Промахнулись комментом, отвечали iGusev-у:)
Совершенно бессмысленно это все. Задач когда нужен инкремент строки настолько исчезающе мало, что я даже придумать не могу.На стэковерфлоу достаточно вопросов как сделать из AAZ ABA или как пробежаться по буквам, но откровенно говоря от нас смысл тоже ускользает.
Вероятно это некий атавизм, наиболее логичное поведение (как по нам) так это в С, в perl уже странновато, но в php слабая типизация превратила это в что-то дико странное и слабо предсказуемое.
Ну вот, еще одна статья, ругающая php. на этот раз за то, что он позволяет инкрементить строки.
Да, в ваш пример, как всегда это бывает, не хватало использования 8-, 16-ричной системы, А-ля прибавим к строке «Abba» +1
Сорри за критику, но будущим комментариям, которые очень скоро будут говорить — «фуууу, php говно. Хорошо что я на нем никогда не пишу.» хочу сказать, что примеры весьма экзотические и редко встречаются в проектах. А если и встречаются, то отлавливаются весьма не плохо, т.к. когда после ++ ожидаешь получить число, а в дебаге выходит строка, то уже ясно где искать.
Да, в ваш пример, как всегда это бывает, не хватало использования 8-, 16-ричной системы, А-ля прибавим к строке «Abba» +1
Сорри за критику, но будущим комментариям, которые очень скоро будут говорить — «фуууу, php говно. Хорошо что я на нем никогда не пишу.» хочу сказать, что примеры весьма экзотические и редко встречаются в проектах. А если и встречаются, то отлавливаются весьма не плохо, т.к. когда после ++ ожидаешь получить число, а в дебаге выходит строка, то уже ясно где искать.
НЛО прилетело и опубликовало эту надпись здесь
А может просто документацию читать надо?
Когда идёт сложение строки с числом, строка приводится к числу.
Для конкатенации в php используется точка
Когда идёт сложение строки с числом, строка приводится к числу.
Для конкатенации в php используется точка
НЛО прилетело и опубликовало эту надпись здесь
Я бы на месте автора скорее удивлялся string(3) «fop», чем двум единичкам, но без чтения базовой документации можно удивляться в приципе чему угодно.
Кстати, стоит помнить, что при инкременте строки не всегда просто инкрементируется последний символ.
php > $a = "zzz";
php > $a++;
php > var_dump($a);
string(4) "aaaa"
Если строку можно преобразовать в число, то перед инкрементом это происходит:
php > $a = "999";
php > $a++;
php > var_dump($a);
int(1000)
php > $a = "9.99";
php > $a++;
php > var_dump($a);
double(10.99)
Но не всегда:
php > $a = "111a";
php > $a++;
php > var_dump($a);
string(4) "111b"
php > $a = "111zzz";
php > $a++;
php > var_dump($a);
string(6) "112aaa"
Насчет разных версий PHP
До PHP 7
$a = "0xff";
$a++;
var_dump($a);
int(256)
В PHP 7
php > $a = "0xff";
php > $a++;
php > var_dump($a);
string(4) "0xfg"
NULL
php > $a = null;
php > $a++;
php > var_dump($a);
int(1)
Но при этом:
php > $a = false;
php > $a++;
php > var_dump($a);
bool(false)
php > $a = true;
php > $a++;
php > var_dump($a);
bool(true)
В следующих случаях инкремент тоже не имеет эффекта:
php > $a = [1];
php > $a++;
php > var_dump($a);
array(1) {
[0] =>
int(1)
}
php > $a = (object)['attr' => 1];
php > $a++;
php > var_dump($a);
class stdClass#1 (1) {
public $attr =>
int(1)
}
php > $a = function($b) { return $b; };
php > var_dump($a);
class Closure#2 (1) {
public $parameter =>
array(1) {
'$b' =>
string(10) "<required>"
}
}
php > $a++;
php > var_dump($a);
class Closure#2 (1) {
public $parameter =>
array(1) {
'$b' =>
string(10) "<required>"
}
}
Это прямо краткое содержание статьи в примерах)
Как раз хотел написать, что давайте будем инкрементить все подряд — массивы, функции и т.д. Спасибо )
Вот так вот, захочешь подбиралку паролей на php написать (Господи прости!) с помощью инкремента строки, так и тут в какой то момент она ВНЕЗАПНО превратится в число! :)
В презентации Дмитрия Стогова (https://github.com/dstogov)
Есть упоминание, что в 7.1 они оптимизируют инкременты.
Как я понял, то код выше будет использовать (где то 34 слайд)
вместо 7.0
Однако могу ошибаться.
Есть упоминание, что в 7.1 они оптимизируют инкременты.
<?php
function sum() {
$sum = 0;
for ($i = 0; $i < 100; $i++) {
$sum = $sum + $i;
}
return $sum;
}
Как я понял, то код выше будет использовать (где то 34 слайд)
ASSIGN_ADD $sum, $i
вместо 7.0
ADD $sum, $i -> T2
ASSIGN $sum, T2
Однако могу ошибаться.
никогда не понимал, зачем так извращаться над кодом в РНР? Или над объектами в JS (статья про [1,2,3]+1)? Зачем писать заведомо бред, и инкрементить string, если ты не идиот?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Инкремент в PHP