Это случилось со мной несколько лет назад, прежде чем я узнал о SO, но мне все еще интересно. Когда я все еще изучал основы PHP, я случайно набрал $i = $i++;
Когда я протестировал веб-страницу в браузере, сервер разбился и потребовалось много времени, чтобы восстановить его. Я набрал некоторые довольно глупые вещи раньше и создал кучу бесконечных циклов, но по какой-то причине это было худшим. Кто-нибудь знает, почему эта линия была настолько «ядовитым»
ответ
$i = $i++;
такая же, как $i = $i;
по существу.
К сожалению, $i = $i++;
известен как "undefined behavior".
Все может произойти просто потому, что компилятор не может полностью понять, что происходит.
Существует отличный вопрос SO, охватывающий такое же неопределенное поведение here.
Звучит правильно, мы использовали действительно искушенный сервер, который объяснял бы, почему другие люди могут снять его без сбоев. – Brian
Мое предположение, несколько лет назад, что версия PHP, с которой работал сервер, будет сбой, если этот код будет запущен. Не уверен. –
Да. Переназначение на 'i' (явно) абсолютно избыточно. Можете увидеть, как новичок может наткнуться на это. Позор, это так неумолимо. –
$ php -r '$i=0; $i = $i++; echo "=> ".$i."\n";'
=> 0
Это не должно разрушать ничего.
$i = $i++;
var_dump($i); // NULL;
Это не нужно инициализировать переменные в PHP, однако это очень хорошая практика. Неинициализированные переменные имеют значение по умолчанию их типа в зависимости от контекста, в котором они используются .
Кроме того, by default, variables are always assigned by value
и так как вы используете Post Increment, значение неинициализированного $ я (NULL) присваивается первой копией до $ я, фактически переписав себя. Смотрите этот код, чтобы увидеть, что происходит:
$i = 0
$i = $i++;
var_dump($i); // int(0);
Я не знаю, если PHP все равно будет пытаться увеличивать правую руку значение переменной после выполнения задания. Если вас это интересует, установите расширение PECL Parsekit и проверьте коды OP для получения дополнительной информации.
Возможно, это было что-то еще, что разбило ваш сервер.
- 1. Оценка приращения прихода i + i ++ + i + i ++;
- 2. Компиляция выражения ++ i + ++ i + ++ i?
- 3. i ++, i = i + 1 и i + = 1, который быстрее?
- 4. Оптимизация «i = b? (I | mask): (i & ~ mask)«
- 5. Как работает следующее выражение i = + i * i ;?
- 6. Поиск указателя i, где A [i] = i
- 7. Приращение ++ i, i ++ и i + = 1
- 8. Почему Math.sqrt (i * i) .floor == i?
- 9. Еще один i = i ++
- 10. Почему ++ i эффективнее i ++?
- 11. Пролог дедушка (i, i)
- 12. Math - Formula V [i] = ([V [i-1] * V [i-1]/(i + 2)] + V [i-1] * i + i + 1)% 666013
- 13. Объясните альтернативный PHP для цикла. Синтаксис: for ($ i = 1, $ j = 0; $ i <= 10; $ j + = $ i, print $ i, $ i ++);
- 14. Обработка строк i php
- 15. , который лучше "for (int i = 0; i! = 5; ++ i)" или "for (int i = 0; i <= 5; i ++)"?
- 16. Почему 'int i = i;' законно?
- 17. Разница между i ++ и ++ i?
- 18. jQuery i ++ и i-- проблемы
- 19. Генераторы Es6: i + = выход i;
- 20. Какова будет ценность i +++ i?
- 21. Javascript заменить I в I
- 22. Замените номер i на i asterisks
- 23. Для каждого результата отображения $ i, $ i ++
- 24. Сколько циклов до ++ $ i beats $ i ++
- 25. В чем разница между ++ $ i и $ i ++ в PHP?
- 26. Самый короткий PHP-код для $ i = $ i + $ x;
- 27. $ string [i] не возвращает i: th символ
- 28. Сортировка массива [i] [0], [i] [1] на основе [i]
- 29. для (++ i; ++ i; ++ i) второй аргумент <или <=?
- 30. Оператор Swift range для i = mymax; i> = 0 i--
Вы повторили попытку и (un) прокомментировать эту строку? Возможно, это было что-то еще, и поскольку вы все еще были молодыми и наивными, ложно пришли к выводу, что эта проблема была проблемой. – Toad
Он не падает на обоих компьютерах (LAMP и WAMP). Тестовый код был просто '$ i = 0; $ i = $ i ++; echo« Вы живы », и он просто сказал« Вы живы »без каких-либо проблем. –
Нет, я определенно помню изменение приращения от '$ i = $ i + 2;' до '$ i ++; 'и создал злой гибрид. – Brian