2010-01-04 3 views
2

Это случилось со мной несколько лет назад, прежде чем я узнал о SO, но мне все еще интересно. Когда я все еще изучал основы PHP, я случайно набрал $i = $i++; Когда я протестировал веб-страницу в браузере, сервер разбился и потребовалось много времени, чтобы восстановить его. Я набрал некоторые довольно глупые вещи раньше и создал кучу бесконечных циклов, но по какой-то причине это было худшим. Кто-нибудь знает, почему эта линия была настолько «ядовитым»

+2

Вы повторили попытку и (un) прокомментировать эту строку? Возможно, это было что-то еще, и поскольку вы все еще были молодыми и наивными, ложно пришли к выводу, что эта проблема была проблемой. – Toad

+1

Он не падает на обоих компьютерах (LAMP и WAMP). Тестовый код был просто '$ i = 0; $ i = $ i ++; echo« Вы живы », и он просто сказал« Вы живы »без каких-либо проблем. –

+0

Нет, я определенно помню изменение приращения от '$ i = $ i + 2;' до '$ i ++; 'и создал злой гибрид. – Brian

ответ

7

$i = $i++; такая же, как $i = $i; по существу.

К сожалению, $i = $i++; известен как "undefined behavior".

Все может произойти просто потому, что компилятор не может полностью понять, что происходит.

Существует отличный вопрос SO, охватывающий такое же неопределенное поведение here.

+0

Звучит правильно, мы использовали действительно искушенный сервер, который объяснял бы, почему другие люди могут снять его без сбоев. – Brian

+2

Мое предположение, несколько лет назад, что версия PHP, с которой работал сервер, будет сбой, если этот код будет запущен. Не уверен. –

+0

Да. Переназначение на 'i' (явно) абсолютно избыточно. Можете увидеть, как новичок может наткнуться на это. Позор, это так неумолимо. –

2

Это не должно разрушать ничего.

$i = $i++; 
var_dump($i); // NULL; 

С PHP Manual

Это не нужно инициализировать переменные в 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 для получения дополнительной информации.

Возможно, это было что-то еще, что разбило ваш сервер.

Смежные вопросы