PHP - это язык программирования, созданный Расмусом Лердорфом в 1994 году, основной целью которого было создание веб-сайтов. Прямо сейчас мы можем сказать, что это язык сценариев общего назначения на стороне сервера, который все еще активно поддерживается.

В PHP мы не всегда получаем ожидаемые значения от переменных. Поскольку в реальных сценариях разработки программного обеспечения разработчик может

  • забудьте объявить переменную или присвоить значение объявленной переменной.
  • забудьте передать требуемый параметр / параметры при вызове функции.
  • использовать результат запроса API или запроса к базе данных, который может иметь нежелательное значение.
  • доступ напрямую к глобальным переменным как к значениям cookie или сеанса, которые еще не определены или имеют неожиданные значения.

Поскольку таких сценариев при разработке программного обеспечения, мы, как разработчики, должны быть более осторожными при написании кода. Нам нужно принять защитный подход к программированию, что означает, что код должен быть готов к работе с неожиданными обстоятельствами и всегда быть осторожным.

В нашем случае это означает, что при работе с переменными мы всегда должны ожидать, что значения переменных будут неожиданными или нежелательными, и мы должны кодировать, учитывая это. Это должен быть один из самых безопасных подходов к кодированию.

Сообщество PHP уже рассмотрело такие сценарии с множеством различных решений, и в этой статье мы рассмотрим эти решения в следующих темах:

  1. Важность проверки переменных
  2. Как проверить переменные в PHP с помощью встроенных функций
  3. Поведение этих встроенных функций
  4. Выбор правильной функции

1. Важность проверки переменных

Вот несколько примеров побочных эффектов использования неотмеченных переменных:

Сценарий 1. Использование необъявленной переменной

echo $undeclaredVariable;

Вывод:

PHP Notice:  Undefined variable: undeclaredVariable

Сценарий 2. Использование нежелательного значения переменной

$emptyUserLastname = "";
echo "Hi Mr. " . $emptyUserLastname;

Вывод:

Hi Mr.

Сценарий 3. Использование претенциозного ответа на вызов службы

function getUserUnsuccessful() {
   return array();
}
$user = getUserUnsuccessful();
echo "Welcome Mr. " . $user["LASTNAME"];

Вывод:

PHP Notice:  Undefined index: LASTNAME

Сценарий 4. Использование ГЛОБАЛЬНОЙ переменной без флажка

echo $_COOKIE["USER_ID"];

Вывод:

PHP Notice:  Undefined index: USER_ID

В этих сценариях вы можете увидеть некоторые уведомления PHP и некоторые неожиданные поведения. Конечно, в таких ситуациях ваш код не выйдет из строя или завершится, но позже из-за использования этой неконтролируемой переменной вы можете столкнуться с неожиданным поведением вашего алгоритма, которое также называется ошибками.

2. Как проверять переменные в PHP с помощью встроенных функций

К счастью, в PHP есть множество встроенных функций для проверки переменных. Но мы не можем использовать их, не зная их точного поведения. Потому что это может привести нас к неожиданному поведению нашего алгоритма. Чтобы избежать этого, нам нужно знать, какие функции мы можем использовать и каково их точное поведение.

Что мне больше всего нравится в PHP, так это то, что вам не нужна какая-либо сторонняя библиотека для решения подобных ситуаций, потому что сообщество PHP уже охватило множество различных тем с помощью встроенных функций. Так что вам не нужно изобретать велосипед.

Вторая любимая часть PHP - это то, что почти все встроенные функции читабельны, что означает, что вы можете понять их назначение и поведение, просто прочитав имя функции.

Предупреждение: использование любой функции в PHP может быть проблематичным с точки зрения передачи параметров или знания возвращаемого значения. Это одна из самых жалоб на PHP. Создатель PHP Расмус Лердорф даже упомянул, что в те старые времена у них не было хороших примеров. В качестве примеров у них были только реализации C. Они решили придерживаться этого, чтобы добиться желаемых результатов в короткие сроки.

В PHP есть две часто используемые функции для проверки переменных: isset () и empty (). Теперь давайте посмотрим на эти встроенные функции для проверки переменных и их точного поведения.

3. Поведение этих встроенных функций

isset ()

Как можно понять из названия функции, она проверяет, установлено ли для данного параметра какое-либо значение или нет. Таким образом, он принимает переменную в качестве параметра и проверяет данный параметр, поскольку он

  • объявлен
  • назначается
  • иметь любые значения, кроме нуля.

Если переменная удовлетворяет всем этим условиям, функция isset () вернет ИСТИНА. В противном случае он вернет ЛОЖЬ.

Вот несколько примеров использования функции isset ():

var_dump(isset($undeclaredVariable)); // prints bool(false)
 
$declaredVariable;
var_dump(isset($declaredVariable)); // prints bool(false)
 
$declaredAndAssignedVariable = NULL;
var_dump(isset($declaredAndAssignedVariable)); // prints bool(false)
 
$declaredAndAssignedVariableOtherThanNull = 1;
var_dump(isset($declaredAndAssignedVariableOtherThanNull)); // prints bool(true)
 
$boolean = FALSE;
var_dump(isset($boolean)); // prints bool(true)
 
$boolean = TRUE;
var_dump(isset($boolean)); // prints bool(true)
 
$string = "";
var_dump(isset($string)); // prints bool(true)
 
$string = "0";
var_dump(isset($string)); // prints bool(true)
 
$string = "A";
var_dump(isset($string)); // prints bool(true)
 
$integer = 0;
var_dump(isset($integer)); // prints bool(true)
 
$integer = 1;
var_dump(isset($integer)); // prints bool(true)
 
$float = 0.0;
var_dump(isset($float)); // prints bool(true)
 
$float = 0.1;
var_dump(isset($float)); // prints bool(true)
 
$array = array();
var_dump(isset($array)); // prints bool(true)
 
$array = array("A");
var_dump(isset($array)); // prints bool(true)

PHP принимает значение NULL для необъявленных и неназначенных переменных. Как видите, кроме необъявленных, неназначенных и NULL значений, функция isset () возвращает TRUE. Функция case isset () очень полезна, когда мы хотим убедиться, объявлена ​​ли переменная, ей присвоено значение NULL или нет.

пустой()

Мы можем неправильно понять назначение функции из ее имени. Похоже, что он делает данный параметр пустым, но на самом деле он только проверяет, является ли данный параметр пустым или нет. Я слышу возражения, вроде isEmpty () могло бы быть лучшим названием для этой функции.

Но опять же, это проблема старых времен, и из-за наследия (не священного, которое поддерживает обратную совместимость новых версий PHP и побуждает пользователей старых версий обновлять свои версии PHP) так и осталось.

Короче говоря, функция empty () принимает один параметр, чтобы проверить, пуста ли данная переменная. Когда мы смотрим на его поведение, оно ведет себя как функция isset () плюс проверяет пустоту значения переменной, что означает, равен ли данный параметр:

  • НУЛЕВОЙ
  • целое 0, двойное 0.00, плавающее 0.0
  • пустая строка («)
  • логическое FALSE
  • пустой массив

Кроме того, у этой функции есть пограничный регистр, который также предполагает, что строка с символами «0», «0,0», «0,00 ..» также пуста.

В приведенных выше случаях он возвращает ИСТИНА, потому что пустая функция принимает эти значения как пустые.

Но почему?

Поскольку пустота переменной функции empty () означает проверку значения переменной с точки зрения логического равенства. Таким образом, PHP решает, является ли данное логическое равенство значения переменной истинным или ложным.

Мы можем видеть логическое равенство значений с помощью функции boolval (), которая возвращает логическое значение заданного параметра из https://www.php.net/manual/en/function.boolval.php. Итак, в PHP:

  • НУЛЕВОЙ
  • целое число 0
  • двойной 0.00
  • float 0.0…
  • пустая строка («)
  • логическое FALSE
  • пустой массив

Значения логических равенств ЛОЖЬ. Исходя из этого, если мы суммируем функцию empty ():

empty() = isset() + boolval()

Мы можем легко понять поведение функции empty () по этой формуле. Можно сказать, что функция empty () является более широкой функцией проверки переменных, чем функция isset (). Таким образом, нам не нужно использовать функции isset () и empty () вместе в одном и том же случае. Все дело в том, чтобы решить, беспокоит нас пустое значение переменной или нет. В конце концов, мы должны использовать хотя бы одну из них для обработки переменных в PHP.

Вот несколько примеров использования пустой функции ()

var_dump(empty($undeclaredVariable)); // prints bool(true)
 
$declaredVariable;
var_dump(empty($declaredVariable)); // prints bool(true)
 
$declaredAndAssignedVariable = NULL;
var_dump(empty($declaredAndAssignedVariable)); // prints bool(true)
 
$declaredAndAssignedVariableOtherThanNull = 1;
var_dump(empty($declaredAndAssignedVariableOtherThanNull)); // prints bool(false)
 
$boolean = FALSE;
var_dump(empty($boolean)); // prints bool(true)
 
$boolean = TRUE;
var_dump(empty($boolean)); // prints bool(false)
 
$string = "";
var_dump(empty($string)); // prints bool(true)
 
// Edge case, empty() accepts "0", "0.0", "0.00", "0.000..." strings as empty strings
$string = "0";
var_dump(empty($string)); // prints bool(true)
 
$string = "A";
var_dump(empty($string)); // prints bool(false)
 
$integer = 0;
var_dump(empty($integer)); // prints bool(true)
 
$integer = 1;
var_dump(empty($integer)); // prints bool(false)
 
$float = 0.0;
var_dump(empty($float)); // prints bool(true)
 
$float = 0.1;
var_dump(empty($float)); // prints bool(false)
 
$array = array();
var_dump(empty($array)); // prints bool(true)
 
$array = array("A");
var_dump(empty($array)); // prints bool(false)

Итак, теперь мы знаем, что можем использовать функции isset () и empty () для проверки переменных. Поскольку мы реализуем их в наших примерных сценариях как:

Сценарий 1. Использование необъявленной переменной

if(isset($undeclaredVariable)) {
   echo $undeclaredVariable;
} else {
   echo "We found an undeclared variable.";
}

Вывод:

We found an undeclared variable.

Сценарий 2. Использование нежелательного значения переменной

$emptyUserLastname = "";
if(!empty($emptyUserLastname)) {
   echo "Hi Mr. " . $emptyUserLastname;
} else {
   echo "Hi Mr. Anonymous";
}

Вывод:

Hi Mr. Anonymous

Сценарий 3. Использование претенциозного ответа на вызов службы

function getUserUnsuccessful() {
  return array();
}
$user = getUserUnsuccessful();
if(!empty($user["LASTNAME"])) {
   echo "Welcome Mr. " . $user["LASTNAME"] . "\n";
} else {
   echo "Hi Mr. Anonymous";
}

Вывод:

Hi Mr. Anonymous

Сценарий 4. Использование ГЛОБАЛЬНОЙ переменной без флажка

if(isset($_COOKIE["USER_ID"])){
   echo $_COOKIE["USER_ID"];
} else {
   echo "User Id is not available.";
}

Вывод:

User Id is not available.

Для всех сценариев с обновленным кодом мы избавляемся от сообщений PHP Notice. Для сценариев 1 и 4 мы предупреждаем наших пользователей, для сценариев 2 и 3 мы избегаем нежелательного поведения алгоритма.

Случай, когда функция empty () полезна, чтобы проверить, объявлена ​​ли данная переменная, присвоена ли она и не имеет ли она пустого значения. Но мы должны быть осторожны с крайними случаями, такими как строки «0», «0,0», «0,00», целое число 0, двойное 0,00, 0,0 с плавающей запятой и т. Д. Потому что в этих крайних случаях наш алгоритм может принять эти значения как непустые. Таким образом, наш алгоритм может работать неожиданным образом, если мы рассмотрим такую ​​ситуацию.

4. Выбор правильной функции

Уловка, чтобы решить использовать функцию isset () или empty (), заключается в следующем:

  • Если случай с переменной состоит в том, что мы должны считать, что она объявлена, присвоена или не равна нулю, используйте isset ()
  • Если дело не в этом, также мы заботимся о том, пуста ли переменная или нет, используйте empty (). Но всегда учитывайте крайние случаи функции empty ().

Не используйте функции isset () и empty () вместе, чтобы проверить один и тот же регистр. Это будет ненужное повторение кода.

Для полного применения защитного подхода недостаточно только функций isset () и empty (). Нам нужно добавить дополнительные проверки с дополнительными встроенными функциями PHP, такими как:

  • нулевой
  • is_bool
  • is_numeric
  • is_float
  • is_int
  • is_string
  • is_array
  • Is_object

В этой статье не рассматриваются эти дополнительные встроенные функции PHP, но вы можете легко понять их поведение, просто прочитав их. Кроме того, вы можете проверить их точное поведение на https://www.php.net/manual/, введя имя функции в поле поиска. Они могут добавить дополнительные меры предосторожности к вашему алгоритму, если вы используете их вместе с функцией isset () или empty ().

Спасибо, что прочитали эту статью. Надеюсь, это поможет вам в работе с переменными в PHP. Вы всегда должны использовать защитный подход в программировании. Это очень полезная привычка, которая также поможет вам в будущем стать лучшим программистом.