Проверка переменной: от существования до типа данных
В PHP проверка переменных необходима для избежания ошибок и корректной обработки данных. Рассмотрим основные функции и операторы, позволяющие определить существование, тип, значение и другие характеристики переменных.
Основные способы проверки переменных
Как проверить, определена ли переменная и не равна ли она null?
Наиболее часто используемая функция - isset(). Она возвращает true, если переменная существует и её значение не null.
$var1 = 10;
$var2 = null;
$var3; // не определена
var_dump(isset($var1)); // bool(true)
var_dump(isset($var2)); // bool(false)
var_dump(isset($var3)); // bool(false)
bool(true) bool(false) bool(false)
Пояснение: isset() не выдаёт предупреждение для неопределённых переменных, поэтому её безопасно использовать. Если требуется проверить, что переменная строго равна null, используйте is_null(), но только после проверки существования.
Типичная ошибка: применение is_null() к неопределённой переменной генерирует warning в PHP 8+ и notice в более старых версиях. Всегда сначала используйте isset() или убедитесь, что переменная определена.
Как проверить, равна ли переменная NULL?
Функция is_null() возвращает true, только если значение переменной равно null.
$val = null;
var_dump(is_null($val)); // bool(true)
$val2 = 0;
var_dump(is_null($val2)); // bool(false)
bool(true) bool(false)
Проблема: is_null() выдаёт E_WARNING, если переменная не определена. Перед вызовом следует проверить существование через isset().
Как определить, что переменная пуста?
empty() возвращает true для значений, которые считаются пустыми: 0, '0', '', null, false, пустой массив [] и неопределённая переменная.
$empty1 = 0;
$empty2 = '0';
$empty3 = '';
$empty4 = null;
$empty5 = false;
$empty6 = [];
var_dump(empty($empty1)); // true
var_dump(empty($empty2)); // true
var_dump(empty($empty3)); // true
var_dump(empty($empty4)); // true
var_dump(empty($empty5)); // true
var_dump(empty($empty6)); // true
bool(true) bool(true) bool(true) bool(true) bool(true) bool(true)
Важно: empty() считает пустыми строку '0' и число 0, что может быть неожиданным, если нужно различать ноль и отсутствие значения. Для строгой проверки используйте is_null() или сравнение с false.
Как узнать тип переменной?
Для определения типа используются функции семейства is_*: is_string(), is_int(), is_float(), is_bool(), is_array(), is_object(), is_numeric() и другие.
$val = 'Hello';
var_dump(is_string($val)); // true
var_dump(is_int($val)); // false
$num = 42;
var_dump(is_int($num)); // true
var_dump(is_numeric($num)); // true
$arr = [1,2,3];
var_dump(is_array($arr)); // true
bool(true) bool(false) bool(true) bool(true) bool(true)
Ошибка: is_numeric() возвращает true для числовых строк (например, '123.45'), что может быть нежелательно, если нужно строго целое число. Для проверки целых чисел используйте is_int() или ctype_digit() для строк.
Как получить строковое представление типа переменной?
Функция gettype() возвращает название типа в виде строки: 'NULL', 'boolean', 'integer', 'double', 'string', 'array', 'object', 'resource', 'unknown type'.
$var = 3.14;
echo gettype($var); // double
$var = null;
echo gettype($var); // NULL
double NULL
Проблема: для неопределённой переменной gettype() выдаёт warning и возвращает 'NULL'. Лучше использовать isset() перед вызовом.
Как проверить значение переменной с помощью фильтров?
Функция filter_var() позволяет валидировать и фильтровать данные по заданным правилам, например, проверить email, URL, целое число в диапазоне.
$email = 'user@example.com';
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); // string(17) "user@example.com"
$url = 'https://example.com';
var_dump(filter_var($url, FILTER_VALIDATE_URL)); // string(23) "https://example.com"
$int = '123';
var_dump(filter_var($int, FILTER_VALIDATE_INT)); // int(123)
$invalid = 'abc';
var_dump(filter_var($invalid, FILTER_VALIDATE_INT)); // bool(false)
string(17) "user@example.com" string(23) "https://example.com" int(123) bool(false)
Ошибка: фильтры не проверяют существование переменной, только её значение. Для проверки наличия переменной используйте isset() перед фильтром.
Как проверить существование ключа в массиве?
Для проверки наличия ключа в массиве применяются array_key_exists() и isset(). Разница: isset() возвращает false, если ключ существует, но его значение null; array_key_exists() вернёт true в обоих случаях.
$arr = ['a' => 1, 'b' => null];
var_dump(isset($arr['a'])); // true
var_dump(isset($arr['b'])); // false (значение null)
var_dump(array_key_exists('b', $arr)); // true
var_dump(isset($arr['c'])); // false
bool(true) bool(false) bool(true) bool(false)
Типичная ошибка: использовать isset() для проверки наличия ключа, когда значение может быть null. Нужно выбирать в зависимости от задачи.
Как проверить существование свойства объекта?
Функция property_exists() проверяет, объявлено ли свойство в классе объекта (даже если оно не инициализировано).
class Test {
public $prop1 = 1;
public $prop2;
}
$obj = new Test();
var_dump(property_exists($obj, 'prop1')); // true
var_dump(property_exists($obj, 'prop2')); // true
var_dump(property_exists($obj, 'prop3')); // false
bool(true) bool(true) bool(false)
Ошибка: property_exists() проверяет только объявленные свойства, а не динамически добавленные. Для динамических свойств используйте isset($obj->prop).
Расширенные примеры применения проверок
Ниже приведены комплексные примеры, демонстрирующие использование различных проверок в реальных сценариях.
Пример 1: Комбинированная проверка с match (PHP 8)
$value = 42;
$type = match (true) {
is_int($value) => 'integer',
is_float($value) => 'float',
is_string($value) => 'string',
is_bool($value) => 'boolean',
is_null($value) => 'null',
is_array($value) => 'array',
is_object($value) => 'object',
default => 'unknown'
};
echo $type; // integer
integer
Пояснение: конструкция match позволяет компактно обработать разные типы без использования if-elseif.
Пример 2: Проверка полей формы с использованием isset и empty
// Предположим, данные пришли из $_POST
$_POST['name'] = 'John';
$_POST['age'] = '';
$errors = [];
if (!isset($_POST['name']) || empty(trim($_POST['name']))) {
$errors[] = 'Имя обязательно';
}
if (!isset($_POST['age']) || (isset($_POST['age']) && !is_numeric($_POST['age']))) {
$errors[] = 'Возраст должен быть числом';
}
if (empty($errors)) {
echo 'Данные валидны';
} else {
print_r($errors);
}
Array
(
[0] => Возраст должен быть числом
)
Пример 3: Проверка существования ключей в многомерном массиве
$config = [
'database' => [
'host' => 'localhost',
'port' => null
]
];
// Безопасное получение значения с использованием null coalescing
$host = $config['database']['host'] ?? 'default_host';
$port = $config['database']['port'] ?? 3306;
// isset проверяет только существование, но не null? В данном случае ?? работает как isset
// Ручная проверка
if (isset($config['database']['host'])) {
echo 'Host: ' . $config['database']['host'];
}
Host: localhost
Пример 4: Проверка метода объекта и его вызов
class Calculator {
public function add($a, $b) { return $a + $b; }
}
$calc = new Calculator();
if (method_exists($calc, 'add')) {
echo $calc->add(3, 4); // 7
}
// Альтернатива с is_callable
if (is_callable([$calc, 'add'])) {
echo call_user_func([$calc, 'add'], 5, 6); // 11
}
7 11
Пример 5: Валидация email с проверкой домена
$email = 'user@gmail.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$domain = substr(strrchr($email, '@'), 1);
if (checkdnsrr($domain, 'MX')) {
echo 'Email корректен и домен существует';
} else {
echo 'Домен не найден';
}
} else {
echo 'Некорректный email';
}
Email корректен и домен существует
Пример 6: Проверка, является ли переменная замыканием (Closure)
$closure = function($x) { return $x * 2; };
if (is_callable($closure)) {
echo $closure(5); // 10
}
// is_callable вернет true и для имени функции 'strlen'
10
Пример 7: Использование is_countable для проверки возможности подсчёта
$array = [1,2,3];
$obj = new ArrayObject([4,5]);
if (is_countable($array)) {
echo count($array); // 3
}
if (is_countable($obj)) {
echo count($obj); // 2
}
// Для объекта без Countable is_countable вернет false
3 2
Пример 8: Проверка числового значения с ctype_digit
$value = '12345';
if (ctype_digit($value)) {
echo "Строка состоит только из цифр";
}
// Отличие от is_numeric: is_numeric('123.45') вернет true, ctype_digit - false
Строка состоит только из цифр