Типы данных в php

Типы данных в php

    <?php #Получить тип данных до php 8 gettype($test); #Получить тип данных после php 8 echo get_debug_type($a_bool); #Еще один способ получить тип данных var_dump($test); #Вернет true если целое число is_int($test); #Вернет true если строка is_string($test); ?>
    Преобразование типов

    Допустимыми значениями являются: "boolean" или "bool"
    "integer" или "int"
    "float" или "double"
    "string"
    "array"
    "object"
    "null"

    <?php settype($test, "integer"); // $foo теперь 5 (целое) ?>
    bool
    <?php var_dump((bool) ""); // bool(false) var_dump((bool) "0"); // bool(false) var_dump((bool) 1); // bool(true) var_dump((bool) -2); // bool(true) var_dump((bool) "foo"); // bool(true) var_dump((bool) 2.3e5); // bool(true) var_dump((bool) array(12)); // bool(true) var_dump((bool) array()); // bool(false) var_dump((bool) "false"); // bool(true) // Consider that the 0 could by any parameters including itself var_dump(0 == 1); // false var_dump(0 == (bool)'all'); // false var_dump(0 == 'all'); // TRUE, take care var_dump(0 === 'all'); // false // To avoid this behavior, you need to cast your parameter as string like that : var_dump((string)0 == 'all'); // false ?>
    Числа

    Целые числа (int) могут быть указаны в десятичной (основание 10), шестнадцатеричной (основание 16), восьмеричной (основание 8) или двоичной (основание 2) системе счисления. Для задания отрицательных целых (int) используется оператор отрицания
    Начиная с PHP 7.4.0, целочисленные литералы могут содержать подчёркивания (_) между цифрами для лучшей читаемости литералов. Эти подчёркивания удаляются сканером PHP
    Если PHP обнаружил, что число превышает размер типа int, он будет интерпретировать его в качестве float. Аналогично, если результат операции лежит за границами типа int, он будет преобразован в float.
    Для явного преобразования в int, используйте приведение (int), (integer), intval().
    Если число с плавающей точкой превышает размеры int, результат будет неопределённым, так как float не имеет достаточной точности
    Значения NaN и Infinity при приведении к int становятся равными нулю
    При преобразовании из float в int, число будет округлено в сторону нуля
    Никогда не приводите неизвестную дробь к int, так как это иногда может дать неожиданные результаты
    Источник: php.net

    <?php $a = 1234; // десятичное число $a = 0123; // восьмеричное число (эквивалентно 83 в десятичной системе) $a = 0o123; // восьмеричное число (начиная с PHP 8.1.0) $a = 0x1A; // шестнадцатеричное число (эквивалентно 26 в десятичной системе) $a = 0b11111111; // двоичное число (эквивалентно 255 в десятичной системе) $a = 1_234_567; // десятичное число (с PHP 7.4.0) ?>

    Следующий пример наглядно демонстрирует неопределенное поведение при сравнении чисел с плавающей точкой

    $x = 8 - 6.4; // which is equal to 1.6 $y = 1.6; var_dump($x == $y); // is not true PHP thinks that 1.6 (coming from a difference) is not equal to 1.6. To make it work, use round() var_dump(round($x, 2) == round($y, 2)); // this is true
    Строки

    В php поддерживается 256 символ, один символ это байт, нет встроенной поддержки unicode
    Для определения строки используется 4 способа:
    одинарными кавычками
    двойными кавычками
    heredoc-синтаксисом
    nowdoc-синтаксисом


    При использовании одинарных кавычек, не поддреживаются последовательности типа '\n \r' и будут выводится как есть

    <?php echo 'это простая строка'; echo 'Также вы можете вставлять в строки символ новой строки вот так, это нормально'; // Выводит: Однажды Арнольд сказал: "I'll be back" echo 'Однажды Арнольд сказал: "I\'ll be back"'; // Выводит: Вы удалили C:\*.*? echo 'Вы удалили C:\\*.*?'; // Выводит: Вы удалили C:\*.*? echo 'Вы удалили C:\*.*?'; // Выводит: Это не будет развёрнуто: \n новая строка echo 'Это не будет развёрнуто: \n новая строка'; // Выводит: Переменные $expand также $either не разворачиваются echo 'Переменные $expand также $either не разворачиваются'; ?>

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


    Третий способ определения строк - это использование heredoc-синтаксиса, все что находится в пределах оператора: <<< как в примере ниже будет обрабатываться как есть, со всеми отступами и переносами

    <?php // без отступов echo <<<END a b c \n END; #Еще один способ определения ?> $values = [<<<END a b c END, 'd e f']; var_dump($values);

    В синтаксисе heredoc Закрывающий идентификатор не должен иметь отступ больше, чем любая строка тела


    Nowdoc - это то же самое для строк в одинарных кавычках, что и heredoc для строк в двойных кавычках. Nowdoc похож на heredoc, но внутри него не осуществляется никаких подстановок. Эта конструкция идеальна для внедрения PHP-кода или других больших блоков текста без необходимости его экранирования.
    Источник: php.net

    <?php echo <<<'EOD' Пример текста, занимающего несколько строк, с помощью синтаксиса nowdoc. Обратные слеши всегда обрабатываются буквально, например, \\ и \'. EOD;
    Отрицательный числовой индекс

    PHP_EOL - перенос каретки
    В PHP 7.1.0 добавлена поддержка отрицательных числовых индексов

    $string = 'string'; echo "Символ с индексом -2 равен $string[-2].", PHP_EOL; $string[-3] = 'o'; echo "Изменение символа на позиции -3 на 'o' даёт следующую строку: $string.", PHP_EOL;
    Сложный фигурный синтаксис

    Элемент массива ( одномерный или многомерный ) заключенный в кавычки работает только с синтаксисом фигурных скобок
    С помощью этого синтаксиса также возможен доступ к свойствам объекта внутри строк.

    <?php error_reporting(E_ALL); $great = 'здорово'; echo "Это { $great}"; //не работает echo "Это {$great}"; //работает $arr = array('test'=>2, 'test1'=>3); echo "Это {$arr['test']}"; echo <<<EOT Меня зовут "$name". Я печатаю $foo->foo. Теперь я вывожу {$foo->bar[1]}. Это должно вывести заглавную букву 'A': \x41 EOT; ?>

    Можно инициализировать статические переменные и свойства/константы класса с помощью синтаксиса heredoc

    <?php // Статические переменные function foo() { static $bar = <<<LABEL Здесь ничего нет... LABEL; } // Константы/свойства класса class foo { const BAR = <<<FOOBAR Пример использования константы FOOBAR; public $baz = <<<FOOBAR Пример использования поля FOOBAR; } ?>

    Замечание: До PHP 8.0.0 для доступа к символу в строке (string) также можно было использовать фигурные скобки, например, $str{42}, для той же цели. Синтаксис фигурных скобок устарел в PHP 7.4.0 и больше не поддерживается в PHP 8.0.0.


    Значение преобразуется в строку с помощью приведения (string), либо функции strval() или автоматически
    Тип "Object" в тип string с помощью метода __toString
    Тип ресурс (resource) всегда преобразуется в строку (string) вида "Resource id #1", где 1 является номером ресурса привязанного к resource во время выполнения.

    Массивы
    <?php $arr = array( 1 => 'Шла', 2 => 'Саша' ); $arr[] = 'по шоссе
    '; #Новый элемент массива echo $arr[3]; $arr['x'] = 'и сосала сушку
    '; #Также добавит элемент с индексом 'x' echo $arr['x']; unset($arr[3]); #Удаляет элемент массива unset($arr); #Удаляет массив полностью ?>

    При удалении элементов массива по отдельности, индексы не удаляются, в таком случае присваивая новое значение массива не указывая индекс, будет учитываться последний существующий индекс в массиве
    Чтобы переиндексировать массив можно использовать функцию array_values();
    Даже если массив не пустой, отсчет индексов начнется с нуля

    $array = array_values($array);
    Деструктуризация массива

    Массивы могут быть деструктурированы с помощью языковых конструкций [] (начиная с PHP 7.1.0) или list()
    Эти конструкции могут быть использованы для деструктуризации массива на отдельные переменные

    <?php $source_array = ['foo', 'bar', 'baz']; [$foo, $bar, $baz] = $source_array; echo $foo; // выведет "foo" echo $bar; // выведет "bar" echo $baz; // выведет "baz" ?>

    Деструктуризация массива может быть использована в конструкции foreach для деструктуризации многомерного массива во время итерации по нему.

    <?php $source_array = [ [1, 'John'], [2, 'Jane'], ]; foreach ($source_array as [$id, $name]) { // логика работы с $id и $name } ?>

    Ассоциативные массивы также могут быть деструктурированы

    <?php $source_array = ['foo' => 1, 'bar' => 2, 'baz' => 3]; // Присваивание элементу с индексом 'baz' переменной $three ['baz' => $three] = $source_array; ?> #Можно менять значения переменных местами $a = 1; $b = 2; [$b, $a] = [$a, $b];

    Источник: php.net


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

    <?php echo $arr[somefunc($bar)]; // заполняем массив всеми элементами из директории $handle = opendir('.'); while (false !== ($file = readdir($handle))) { $files[] = $file; } var_dump( $files ); closedir($handle); echo "<br>"; #Кол-во элементов в массиве echo count($files); #Сортировка массива sort($files); echo "<br>"; print_r($files); ?>
    Объекты

    #Первый способ создать пустой объект $emptyObj = new stdClass(); var_dump($emptyObj); $emptyObj -> test = 'value'; echo $emptyObj -> test; #Второй способ $obj2 = new class{}; $obj2 -> test = 'value value'; echo $obj2 -> test; #Третий способ $obj3 = (object)[]; $obj3 -> test = 'value value value'; echo $obj3 -> test; #Преобразование в json echo json_encode([ $emptyObj, $obj2, $obj3 ]); #Преобразование массива в объект $object = (object) [ 'propertyOne' => 'foo', 'propertyTwo' => 42, ];
    Перечисления

    <?php enum Day { case Monday; case Tuesday; case Wednesday; case Thursday; case Friday; case Saturday; case Sunday; } function GetDay(Day $day) { } ?>
    Ресурсы

    Тип resource - специальная переменная, содержит специальные указатели на открытые файлы, соединения с базой данных, области изображения и прочее.
    Ресурсы используются специальными функциями
    Список этих функций здесь
    Смотри также описание функции get_resource_type()

    callback-функции

    Callback-функции могут быть объявлены типом callable.
    Такие функции как call_user_func() или usort(), принимают определённые пользователем callback-функции в качестве параметра. Callback-функции могут быть как простыми функциями, так и методами объектов, включая статические методы классов.
    Можно использовать любые встроенные, либо созданные пользователем функции, за исключением конструкций языка, таких как: array(), echo, empty(), eval(), exit(), isset(), list(), print или unset().
    Метод созданного объекта (object) передаётся как массив, содержащий объект по индексу 0 и имя метода по индексу 1. Доступ к закрытым и защищённым методам разрешён изнутри класса.
    Статические методы класса также могут быть вызваны без создания экземпляра объекта класса путём передачи имени класса вместо объекта в элементе массива с индексом 0 или выполнения 'ClassName::methodName'.

    <?php // Пример callback-функции function my_callback_function() { echo 'Привет, мир!'; } // Пример callback-метода class MyClass { static function myCallbackMethod() { echo 'Привет, мир!'; } } // Тип 1: Простой callback call_user_func('my_callback_function'); // Тип 2: Вызов статического метода класса call_user_func(array('MyClass', 'myCallbackMethod')); // Тип 4: Вызов статического метода класса call_user_func('MyClass::myCallbackMethod'); ?>
    mixed

    Тип mixed принимает любое значение. Он эквивалентен объединённому типу, все остальные типы являются его подтипами.

    void

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

    never

    never - объявление типа только для возвращаемого значения, указывает на то, что функция не завершается. Функция не завершается вызывая exit(), либо выбрасывает исключение, либо является бесконечным циклом.
    never является подтипом любого другого типа и может заменить любой другой тип возвращаемого значения.


    Источники
    Последнее изменение: 05.11.2024 23:51


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ