Разделить на ноль Аномалия в PHP

Ошибка Google Chrome 500

Итак, я поиграл с идеей цикла переполнения стека. Я ввел следующий код и получил симпатичное маленькое изображение в Google Chrome (их ответ на внутреннюю ошибку 500, которая, кстати, НЕ полезна для Google!). Это было ожидаемо и намеренно.

Набор кодов №2

<?php
    for($x=-1;$x<=3;$x++){
     echo $x/0.">";
    }
?>

Проверив заголовки, я нашел:

http://server.domain/overflow.php

GET /overflow.php HTTP/1.1
Host: server.domain
User-Agent: Browser
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0

HTTP/1.0 500 Internal Server Error
Date: Thu, 22 Aug 2013 21:51:30 GMT
Server: Apache
X-Powered-By: PHP/5.3.3
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Я пришел к приведенному выше коду, потому что мне было интересно узнать о делении на ноль и о том, как это обрабатывает PHP. Я написал код ниже, чтобы попытаться вызвать результат, но не получил того, что ожидал. Проблема в том, что вместо того, чтобы получить 500 internal server error из следующего кода, я получаю что-то еще... NULL, где я ожидаю, что сервер выдаст ошибку.

Набор кодов №1

<?php
    for($x=-1;$x<=3;$x++){
     echo $x/$x.">";
    }
?>

Вывод

1>>1>1>1>

Вопрос

Почему первый бит кода не вызывает внутреннюю ошибку сервера 500, так как я делю на ноль? 1/1=1,1/0=500 Error,0/0=Null


person AbsoluteƵERØ    schedule 22.08.2013    source источник
comment
Проверьте журналы вашего сервера. Когда вы получаете ошибки сервера, вы найдете их там.   -  person elclanrs    schedule 23.08.2013
comment
Я видел ошибку 500 из второго набора кодов. Я ожидал этого с самого начала, но получил только NULL.   -  person AbsoluteƵERØ    schedule 23.08.2013
comment
PHP достаточно хорош, чтобы не допустить конца света и вместо этого выдать вам приятное предупреждение. Хороший парень PHP.   -  person PeeHaa    schedule 23.08.2013
comment
ну, вам также может быть интересно узнать о приоритете операторов php.net/manual/ ru/language.operators.precedence.php   -  person hakre    schedule 23.08.2013
comment
Этот вопрос кажется не по теме, потому что речь идет о включении отчетов об ошибках.   -  person PeeHaa    schedule 23.08.2013
comment
ini_set('display_errors',1); error_reporting(E_ALL); творит чудеса   -  person Amal Murali    schedule 23.08.2013
comment
@AmalMurali Да, я отключил переопределение в конфигурации. Так что это не сработало. Мысль display_errors была включена.   -  person AbsoluteƵERØ    schedule 23.08.2013
comment
Это интересно. Вы делаете вид, что 0/0 = null А 1/0 => деление на ноль Я проверю это завтра.   -  person Lorenz Meyer    schedule 23.08.2013
comment
@LorenzMeyer Я не притворялся, просто смотрел на вывод, предполагая, что display_errors включен.   -  person AbsoluteƵERØ    schedule 23.08.2013


Ответы (2)


Вы получаете ошибку с первой версией, потому что у вас есть синтаксическая ошибка. PHP рассматривает точку в 0. как десятичную точку, а не как оператор конкатенации. Правильный код будет либо:

($x/0) . ">"; // This version is my preference

Or:

$x/0. . ">";
person Paul    schedule 22.08.2013
comment
или разделите выражения только запятой. о, да, PHP уже сообщает вам об этом в сообщении об ошибке. смешной. - person hakre; 23.08.2013
comment
@hakre Это также сработает для ОП, потому что эхо может принимать несколько аргументов, но в общем случае конкатенации строк с числовым литералом это не так, поэтому я пропустил это. - person Paul; 23.08.2013

Вы должны получить

Parse error: syntax error, unexpected '">"' (T_CONSTANT_ENCAPSED_STRING), expecting ',' or ';' in /your_file.php on line 3

Изменение вашего кода на

<?php
    for($x=-1;$x<=3;$x++){
     echo $x/0;
     echo ">";
    }
?>

достанет тебя

Warning: Division by zero in /your_file.php on line 3
>
Warning: Division by zero in /your_file.php on line 3
>
Warning: Division by zero in /your_file.php on line 3
>
Warning: Division by zero in /your_file.php on line 3
>
Warning: Division by zero in /your_file.php on line 3
>
person stealthyninja    schedule 22.08.2013