Для начала как уже упоминалось разница состоит в том что
PHP:
<?php
error_reporting(E_ALL);
unset($var);
$test = $var;
var_dump($test);
?>
и
PHP:
<?php
error_reporting(E_ALL^E_NOTICE);
unset($var);
$test = $var;
var_dump($test);
?>
первый случай выдает warning.
Как видно, если переменная неопределена, то вместо её значения используется NULL. Выдача warning
может привести к проблемам описанным в [f]headers[/f]. Но это не значит что нужно писать скрипты с отключенным E_NOTICE.
Посмотрим почему работает и та и другая конструкция. Все дело в приведении типов.
PHP:
<?
$test = intval(NULL);
echo "Int: ";
var_dump($test);
echo "<br>";
$test = strval(NULL);
echo "String: ";
var_dump($test);
echo "<br>";
$test = (bool)(NULL);//функции для bool нету.
echo "Bool: ";
var_dump($test);
echo "<br>";
?>
В случае с if происходит приведение NULL в тип bool. Как и ожидалось приводит он его к значению false.
За счет приведения типов мы получаем также либо пустую строку либо 0. Что довольно часто используется в скриптах, написанных с использованием error_reporting(E_ALL^E_NOTICE).
Современным стилем является разработка скриптов с установкой error_reporting(E_ALL), что накладывает определенные обязанности на разработчика, но в то же время позволяет избежать появления багов,