Примечание: неопределенная переменная
Из обширной мудрости PHP Manual :
Использование значения по умолчанию для неинициализированной переменной проблематично в случае включения одного файла в другой, который использует то же имя переменной. Это также серьезная угроза безопасности с включенным register_globals . E_NOTICE Ошибка уровня выдается при работе с неинициализированными переменными, но не при добавлении элементов в неинициализированный массив. isset () Языковая конструкция может использоваться для определения, была ли переменная уже инициализирована. Дополнительно и более идеальным является решение empty () , поскольку оно не генерирует предупреждение или сообщение об ошибке, если переменная не инициализирована.
Из PHP документации :
Предупреждение не генерируется, если переменная не существует. Это означает
empty () является кратким эквивалентом ! Isset ($ var) || $ вар
== false .
Это означает, что вы можете использовать только empty()
, чтобы определить, установлена ли переменная, и, кроме того, она проверяет переменную по следующим параметрам: 0
, 0.0
, ""
, "0"
, null
, false
или []
.
* * Пример 1 042:
$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
echo (!isset($v) || $v == false) ? 'true ' : 'false';
echo ' ' . (empty($v) ? 'true' : 'false');
echo "\n";
});
Проверьте приведенный выше фрагмент в онлайн-редакторе 3v4l.org
Хотя PHP не требует объявления переменных, он рекомендует его для того, чтобы избежать некоторых уязвимостей или ошибок, которые могут привести к тому, что вы забудете указать значение переменной, которая будет использоваться позже в скрипте. В случае необъявленных переменных PHP делает ошибку очень низкого уровня, E_NOTICE
, о которой даже не сообщается по умолчанию, но Руководство рекомендует разрешить во время разработки.
Способы решения проблемы:
Рекомендуется: Объявите ваши переменные, например, когда вы пытаетесь добавить строку в неопределенную переменную. Или используйте isset()
/ !empty()
, чтобы проверить, объявлены ли они, прежде чем ссылаться на них, как в:
//Initializing variable
$value = ""; //Initialization value; Examples
//"" When you want to append stuff later
//0 When you want to add numbers later
//isset()
$value = isset($_POST['value']) ? $_POST['value'] : '';
//empty()
$value = !empty($_POST['value']) ? $_POST['value'] : '';
С PHP 7.0 это стало намного чище, теперь вы можете использовать оператор null coalesce :
// Null coalesce operator - No need to explicitly initialize the variable.
$value = $_POST['value'] ?? '';
Установить пользовательский обработчик ошибок для E_NOTICE и перенаправить сообщения из стандартного вывода (возможно, в файл журнала):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
Отключить E_NOTICE от создания отчетов. Быстрый способ исключить только E_NOTICE
:
error_reporting( error_reporting() & ~E_NOTICE )
Устранить ошибку с помощью оператора @ .
Примечание: Настоятельно рекомендуется реализовать только пункт 1.
Примечание: неопределенный индекс / неопределенное смещение
Это уведомление появляется, когда вы (или PHP) пытаетесь получить доступ к неопределенному индексу массива.
Способы решения проблемы:
Проверьте, существует ли индекс, прежде чем вы получите к нему доступ. Для этого вы можете использовать isset()
или array_key_exists()
:
//isset()
$value = isset($array['my_index']) ? $array['my_index'] : '';
//array_key_exists()
$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
Языковая конструкция list()
может генерировать это при попытке доступа к индексу массива, который не существует:
list($a, $b) = array(0 => 'a');
//or
list($one, $two) = explode(',', 'test string');
Две переменные используются для доступа к двум элементам массива, однако существует только один элемент массива, индекс 0
, поэтому будет сгенерировано:
Примечание: неопределенное смещение: 1
$_POST
/ $_GET
/ $_SESSION
переменная
Приведенные выше уведомления часто появляются при работе с $_POST
, $_GET
или $_SESSION
. Для $_POST
и $_GET
вам просто нужно проверить, существует индекс или нет, прежде чем использовать их. Для $_SESSION
вы должны убедиться, что сессия началась с session_start()
и что индекс также существует.
Также обратите внимание, что все 3 переменные суперглобальные и прописные.
Связанный: