Is scalar: примеры (PHP)

Использование is_scalar для определения скалярных переменных в PHP
Раздел: Работа с переменными
is_scalar(mixed $value): bool
Назначение и синтаксис функции is_scalar

Функция is_scalar проверяет, является ли переменная скалярным значением. Скалярные типы в PHP включают целые числа (int), числа с плавающей точкой (float), строки (string) и логические значения (bool). Функция возвращает true, если переменная относится к одному из этих типов.

Использование функции актуально в ситуациях, когда необходимо убедиться, что переменная содержит простое значение, а не составной тип данных, такой как массив, объект или ресурс. Это часто требуется при валидации пользовательского ввода, сериализации данных или обработке параметров функций.

Синтаксис функции прост: is_scalar(mixed $value): bool. Единственный параметр $value — проверяемая переменная. Функция возвращает логическое значение (true или false).

Базовые примеры проверки типов

Функция реагирует на основные скалярные типы и составные данные.

<?php
// Проверка целого числа
$var1 = 42;
var_dump(is_scalar($var1)); // bool(true)

// Проверка строки
$var2 = "Пример";
var_dump(is_scalar($var2)); // bool(true)

// Проверка числа с плавающей точкой
$var3 = 3.14159;
var_dump(is_scalar($var3)); // bool(true)

// Проверка логического значения
$var4 = true;
var_dump(is_scalar($var4)); // bool(true)

// Проверка массива
$var5 = [1, 2, 3];
var_dump(is_scalar($var5)); // bool(false)

// Проверка объекта
$var6 = new stdClass();
var_dump(is_scalar($var6)); // bool(false)

// Проверка null
$var7 = null;
var_dump(is_scalar($var7)); // bool(false)

// Проверка ресурса
$var8 = fopen('php://temp', 'r');
var_dump(is_scalar($var8)); // bool(false)
fclose($var8);
?>
Результаты:
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
bool(false)
bool(false)
Похожие функции для проверки типов в PHP

PHP предлагает семейство функций is_* для точной проверки типов.

  • is_int() — проверяет, является ли переменная целым числом.
  • is_float() или is_double() — проверяет число с плавающей точкой.
  • is_string() — проверяет строковый тип.
  • is_bool() — проверяет логическое значение.
  • is_numeric() — проверяет, является ли значение числом или строкой, содержащей число. Эта функция отличается от is_scalar, так как принимает строки типа "123".
  • is_countable() — проверяет, можно ли подсчитать количество элементов (массивы, объекты, реализующие Countable).

Функцию is_scalar предпочтительно использовать, когда необходимо обобщённо убедиться, что значение не является массивом, объектом или ресурсом. Для точной проверки конкретного типа лучше применять специализированные функции (is_int, is_string).

Распространенные ошибки и недочёты

Основная ошибка — предположение, что is_scalar вернёт true для значения null.

<?php
$value = null;
if (is_scalar($value)) {
    echo "Это скалярное значение";
} else {
    echo "NULL не является скаляром"; // Это выполнится
}
?>
NULL не является скаляром

Ещё одна типичная ситуация — попытка использовать функцию для проверки элементов массива без итерации.

<?php
$array = [1, 'text', [3, 4]];
var_dump(is_scalar($array)); // false, так как $array — массив
// Для проверки элементов нужен цикл
foreach ($array as $element) {
    var_dump(is_scalar($element));
}
?>
bool(false)
bool(true)
bool(true)
bool(false)
История изменений в версиях PHP

Функция is_scalar была стабильной на протяжении многих релизов. Начиная с PHP 4.0.0, она всегда возвращала false для null. В PHP 8.0.0 не было внесено изменений в её поведение, но общая система типов стала строже. Например, внутренние функции теперь чаще выдают TypeError при несоответствии типов, что делает предварительную проверку с помощью is_scalar ещё более полезной.

Расширенные примеры применения
Проверка параметров функции
Пример php
<?php
function processValue($input) {
    if (!is_scalar($input)) {
        throw new InvalidArgumentException('Ожидается скалярное значение.');
    }
    return "Обработано: " . htmlspecialchars((string) $input);
}

try {
    echo processValue(123) . "\n";
    echo processValue([1,2]);
} catch (InvalidArgumentException $e) {
    echo "Ошибка: " . $e->getMessage();
}
?>
Обработано: 123
Ошибка: Ожидается скалярное значение.
Фильтрация массива
Пример php
<?php
$mixedData = [
    42,
    "строка",
    ["вложенный массив"],
    true,
    null,
    new DateTime(),
    3.14
];

$scalarOnly = array_filter($mixedData, 'is_scalar');
print_r($scalarOnly);
?>
Array
(
    [0] => 42
    [1] => строка
    [3] => 1
    [5] => 3.14
)
Работа с конфигурацией
Пример php
<?php
// Эмуляция данных конфигурации
$config = [
    'site_name' => 'Мой сайт',
    'debug' => false,
    'max_users' => 1000,
    'plugins' => ['seo', 'cache'], // не скаляр
    'version' => 2.5
];

foreach ($config as $key => $value) {
    echo $key . ": " . (is_scalar($value) ? $value : '[НЕСКАЛЯРНОЕ ЗНАЧЕНИЕ]') . "\n";
}
?>
site_name: Мой сайт
debug: 
max_users: 1000
plugins: [НЕСКАЛЯРНОЕ ЗНАЧЕНИЕ]
version: 2.5
Сериализация только скалярных данных
Пример php
<?php
$dataSet = ['id' => 1, 'name' => 'Иван', 'meta' => ['age' => 30]];

$preparedData = [];
foreach ($dataSet as $key => $value) {
    if (is_scalar($value)) {
        $preparedData[$key] = $value;
    } else {
        $preparedData[$key] = json_encode($value);
    }
}

print_r($preparedData);
?>
Array
(
    [id] => 1
    [name] => Иван
    [meta] => {"age":30}
)
Аналоги в других языках программирования

Is scalar в Python

В Python нет прямой аналогии, но проверку на базовые типы можно реализовать с помощью isinstance().

def is_scalar_py(value):
    scalar_types = (int, float, str, bool, bytes)
    return isinstance(value, scalar_types)

print(is_scalar_py(42))          # True
print(is_scalar_py([1, 2]))      # False
print(is_scalar_py(None))        # False
True
False
False

Is scalar в Javascript

В JavaScript строгая проверка типов отличается. Простые типы — это string, number, boolean, bigint, symbol, undefined.

function isScalarJs(value) {
    return (typeof value !== 'object' && typeof value !== 'function') || value === null;
}

console.log(isScalarJs(42));        // true
console.log(isScalarJs('text'));    // true
console.log(isScalarJs([1,2]));     // false
console.log(isScalarJs(null));      // true (особенность JS)
true
true
false
true

Is scalar в MySQL

В SQL нет прямой функции, но типы данных столбцов определяются при создании таблицы. Проверка происходит на уровне запросов с помощью операторов типа CAST или REGEXP для валидации формата.

PHP is_scalar function comments

En
Is scalar Finds whether a variable is a scalar