Типы данных в 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 является подтипом любого другого типа и может заменить любой другой тип возвращаемого значения.