Если вы не инициализировали ссылочный тип и хотите установить или прочитать одно из его свойств, он будет генерировать исключение NullReferenceException.
Пример:
Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.
Вы можно просто избежать этого, проверив, является ли переменная не нулевой:
Person p = null;
if (p!=null)
{
p.Name = "Harry"; // Not going to run to this point
}
Чтобы полностью понять, почему выбрано исключение NullReferenceException, важно знать разницу между типами значений и ссылочные типы .
Итак, если вы имеете дело со типами значений, NullReferenceExceptions не может произойти. Хотя вам нужно поддерживать оповещение при работе со ссылочными типами!
Только ссылочные типы, как следует из названия, могут содержать ссылки или буквально буквально ничто (или «нуль»). Если типы значений всегда содержат значение.
Типы ссылок (эти должны быть проверены):
Типы значений (вы можете просто игнорировать эти):
if( isset($_POST['fromPerson']) )
{
$fromPerson = '+from%3A'.$_POST['fromPerson'];
echo $fromPerson;
}
isset
не подходит. Согласно документации PHP: http://php.net/manual/en/function .array-key-exists.php (см. пример # 2 array_key_exists () vs isset ()) Метод array_key_exists
предназначен для проверки присутствия ключа в массиве.
Итак, код в вопрос может быть изменен следующим образом:
function fromPerson() {
if (array_key_exists('fromPerson', $_POST) == FALSE) {
return '';
} else {
return '+from%3A'.$_POST['fromPerson'];
};
}
$newString = fromPerson();
isset
, когда поле post задано, но содержит NULL. Это хорошая альтернатива i>, , если i> вы хотите разрешить NULL
в ветви else
. Однако i>, это ошибка, если требуется строка; в этой ситуации isset
делает правильную вещь, но этот код этого не делает - он передаст значение NULL
. Более поздний ответ Роберта демонстрирует разницу.
– ToolmakerSteve
8 January 2017 в 04:03
if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
echo 'blah' . $_POST['fromPerson'];
}
is_array()
проверяет, является ли это массивом, вторая часть проверяет, имеет ли он элемент с ключом 'fromPerson'
.
– jezmck
10 February 2011 в 10:07
Удивленный он не упоминался
if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){
isset($_POST['fromPerson']
- true
, хотя if($_SERVER['REQUEST_METHOD'] == 'POST'
- false
. Если не существует такой ситуации, все, что необходимо, это часть isset...
.
– ToolmakerSteve
8 January 2017 в 03:13
Все методы на самом деле обескуражены, это предупреждение в Netbeans 7.4, и, безусловно, хорошей практикой является не прямой доступ к сверхглобальным переменным, вместо этого используйте фильтр
$fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
if($fromPerson === NULL) { /*$fromPerson is not present*/ }
else{ /*present*/ }
var_dump($fromPerson);exit(0);
isset
намного читабельнее, чем выражение фильтра. Но спасибо, что указали это; это полезный вариант для рассмотрения.
– ToolmakerSteve
4 November 2015 в 18:13
empty
, сработали неуправляемым типом php, его жесткий что доступ к $ _POST будет считаться плохим стилем.)
– ToolmakerSteve
8 January 2017 в 03:55
//Note: This resolves as true even if all $_POST values are empty strings
if (!empty($_POST))
{
// handle post data
$fromPerson = '+from%3A'.$_POST['fromPerson'];
echo $fromPerson;
}
if (isset($_POST['fromPerson']) )
{
$fromPerson = '+from%3A'.$_POST['fromPerson'];
echo $fromPerson;
}
empty()
является не правильным для выбора # 1, потому что в php строка '0'
эквивалентна false
- и empty()
возвращает true
для все значения, эквивалентные false i>. Поэтому, используя empty
, код будет пропускать печать, если значение было '0'
. Если вы хотите исключить пустую строку, см. Ответ Августа.
– ToolmakerSteve
8 January 2017 в 03:38
if( isset($_POST['fromPerson']) )
прав.
Вы можете использовать функцию и вернуться, а затем направлять эхо.
Мне нравится проверять, является ли он iset и если он пуст в тройном операторе.
// POST variable check
$userID = (isset( $_POST['userID'] ) && !empty( $_POST['userID'] )) ? $_POST['userID'] : null;
$line = (isset( $_POST['line'] ) && !empty( $_POST['line'] )) ? $_POST['line'] : null;
$message = (isset( $_POST['message'] ) && !empty( $_POST['message'] )) ? $_POST['message'] : null;
$source = (isset( $_POST['source'] ) && !empty( $_POST['source'] )) ? $_POST['source'] : null;
$version = (isset( $_POST['version'] ) && !empty( $_POST['version'] )) ? $_POST['version'] : null;
$release = (isset( $_POST['release'] ) && !empty( $_POST['release'] )) ? $_POST['release'] : null;
empty('0')
- true
. Поэтому лучше не иметь version
0
или userID
0
и т. Д.
– Shi
8 January 2017 в 02:55
Правильный способ проверки наличия ключа массива - это функция array_key_exists()
. Разница в том, что когда вы имеете $_POST['variable'] = null
, это означает, что ключ существует и отправляется, но значение равно null
Другим вариантом является isset()
, который будет проверять, существует ли ключ массива, и если он был установлен
Последний параметр - использовать empty()
, который будет проверять, существует ли ключ массива, если он установлен и если значение не считается пустым.
Примеры:
$arr = [
'a' => null,
'b' => '',
'c' => 1
];
array_key_exists('a', $arr); // true
isset($arr['a']); // false
empty($arr['a']); // true
array_key_exists('b', $arr); // true
isset($arr['b']); // true
empty($arr['b']); // true
array_key_exists('c', $arr); // true
isset($arr['c']); // true
empty($arr['c']); // false
Что касается вашего вопроса
Правильный способ проверить, было ли отправлено значение, это использовать array_key_exists ( ) с проверкой метода запроса
if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)
{
// logic
}
Но есть некоторые случаи, зависящие от вашей логики, где isset()
и empty()
также могут быть хорошими.
empty
. Согласно замечанию Ши на ответе Августа Фрэнсиса , empty()
является не правильным в качестве альтернативного выбора, потому что в php строка '0'
эквивалентна false
- и empty()
возвращает true
для всех значений, эквивалентных false i>. Поэтому, используя empty
, код будет пропускать печать, если значение было '0'
. Если вы хотите исключить пустую строку, см. Ответ Августа.
– ToolmakerSteve
8 January 2017 в 03:45
Все говорят использовать isset () - что, вероятно, будет работать для вас.
Однако важно понимать разницу между
$_POST['x'] = NULL;
и $_POST['x'] = '';
isset($_POST['x'])
вернет false
в первом примере, но вернет true
на второй, даже если вы попытаетесь распечатать один из них, оба возвращают пустое значение.
Если ваш $_POST
поступает из введенного пользователем поля / формы и остается пустым, я ВЕРЮ (я не на 100% уверен в этом), что значение будет «", но NOT NULL.
Даже если это предположение неверно (кто-то, пожалуйста, поправьте меня, если я ошибаюсь!) выше все еще полезно знать для будущего использования.
empty()
здесь не здесь, потому что в php строка '0'
эквивалентна false
- и empty()
возвращает true
для все значения, эквивалентные false i>. Поэтому, используя empty
, код будет пропускать печать, если значение было '0'
.
– ToolmakerSteve
8 January 2017 в 03:23
Попробуйте
if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
echo "Cool";
}
empty($_POST['fromPerson'])
делает этот комбинированный тест. Легче читать и печатать :)
– ToolmakerSteve
4 November 2015 в 18:19
empty('0')
возвращает true
. Так что это не то же самое.
– Shi
8 January 2017 в 02:53