Pull to refresh

Comments 27

Слабая динамическая типизация и ее глюки особенности.
Разработчик не на PHP и его предрассудки особенности.
Ну положим идею о таком инкременте не php-шники придумали.
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, хеши и т.п.).
Ну так я говорю о языках со слабой динамической типизацией вообще, а не по php конкретно.
Промахнулись комментом, отвечали iGusev-у:)

Совершенно бессмысленно это все. Задач когда нужен инкремент строки настолько исчезающе мало, что я даже придумать не могу.
На стэковерфлоу достаточно вопросов как сделать из AAZ ABA или как пробежаться по буквам, но откровенно говоря от нас смысл тоже ускользает.
Вероятно это некий атавизм, наиболее логичное поведение (как по нам) так это в С, в perl уже странновато, но в php слабая типизация превратила это в что-то дико странное и слабо предсказуемое.
Ну вот, еще одна статья, ругающая php. на этот раз за то, что он позволяет инкрементить строки.

Да, в ваш пример, как всегда это бывает, не хватало использования 8-, 16-ричной системы, А-ля прибавим к строке «Abba» +1

Сорри за критику, но будущим комментариям, которые очень скоро будут говорить — «фуууу, php говно. Хорошо что я на нем никогда не пишу.» хочу сказать, что примеры весьма экзотические и редко встречаются в проектах. А если и встречаются, то отлавливаются весьма не плохо, т.к. когда после ++ ожидаешь получить число, а в дебаге выходит строка, то уже ясно где искать.
от этого пхп говном быть не перестает, сложно представить что в век новых стандартов с++, производительности js и языкового стиля swift еще есть люди которые прыгают в яму с асфальтом к этому динозавру :)
Простите, вы бы не могли про каждый язык программирования что-то в таком ключе написать? Правда, я бы такой пост (а там будет не один экран текста) с удовольствием почитал. Да и вы немного кругозор расширите )
Php развивается в последнее время огромными шагами, не нужно так разработчиков php троллить.
UFO just landed and posted this here
«чукча не читатель, чукча писатель»
Обычно когда нужно что то быстро разработать проект, на документацию PHP не хватает времени. Поэтому возможно получаются проекты из категории «АД»
А может просто документацию читать надо?
Когда идёт сложение строки с числом, строка приводится к числу.
Для конкатенации в php используется точка
Даже правильнее будет сказать, что при совершении любых математических операций со стройкой, она будет приведена к числу.
UFO just landed and posted this here
Я думаю, смысл статьи не в том, чтобы показать «смотрите, как в PHP странно работает инкремент», а в том, чтобы объяснить, почему он так работает.
UFO just landed and posted this here
Я бы на месте автора скорее удивлялся 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 они оптимизируют инкременты.

<?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


Однако могу ошибаться.
UFO just landed and posted this here
никогда не понимал, зачем так извращаться над кодом в РНР? Или над объектами в JS (статья про [1,2,3]+1)? Зачем писать заведомо бред, и инкрементить string, если ты не идиот?

А что плохого в том, чтобы рассказать о таких вот особенностях языка?
Статья не призывает инкрементировать строки, или к интам плюсовать объекты, потому что так можно, статья рассказывает об особенностях работы ++, +=, +1.

Sign up to leave a comment.