Проверка переменной: от существования до типа данных

Раздел: PHP основы -> Типы данных и переменные

В 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
Строка состоит только из цифр

Проверить переменную в PHP - comments

En
Php проверить переменную (php)