Найти в Дзене

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

PHP все больше стримится к статической типизации и поэтому знание типов данных в PHP является необходимой базой для каждого разработчика. Разделить типы данных в PHP можно на 3 группы: Если более подробнее, то: 1. INTEGER - целочисленный тип данных. Хранит только числа без запятой в диапазоне от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Лимиты могут меняться в зависимости от платформы (32 или 64 бит). Полные лимиты хранятся в константах PHP_INT_MAX и PHP_INT_MIN. Пример: $age = 25;
$temperature = -10;
$count = 0;
$largeNumber = 1_000_000; // PHP 7.4+ Также можно хранить не только десятичные варианты чисел, но и их аналоги в других системах исчисления. Пример: $num10 = 28; // десятичное число
$num2 = 0b11100; // двоичное число (28 в десятичной системе)
$num8 = 034; // восьмеричное число (28 в десятичной)
$num16 = 0x1C; // шестнадцатиричное число (28 в десятичной) Если привысить диапазон указанные в PHP_INT_MIN и PHP_INT_MAX, то страшного ничего не произойдет. Просто PHP
Оглавление

PHP все больше стримится к статической типизации и поэтому знание типов данных в PHP является необходимой базой для каждого разработчика.

Разделить типы данных в PHP можно на 3 группы:

  • Скалярные - (integer, float, string, boolean)
  • Составные типы - (array, object)
  • Специальные типы - (null, resource, callable, iterable)

Если более подробнее, то:

Скалярные типы:

1. INTEGER - целочисленный тип данных. Хранит только числа без запятой в диапазоне от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Лимиты могут меняться в зависимости от платформы (32 или 64 бит). Полные лимиты хранятся в константах PHP_INT_MAX и PHP_INT_MIN.

Пример:

$age = 25;
$temperature = -10;
$count = 0;
$largeNumber = 1_000_000; // PHP 7.4+

Также можно хранить не только десятичные варианты чисел, но и их аналоги в других системах исчисления.

Пример:

$num10 = 28; // десятичное число
$num2 = 0b11100; // двоичное число (28 в десятичной системе)
$num8 = 034; // восьмеричное число (28 в десятичной)
$num16 = 0x1C; // шестнадцатиричное число (28 в десятичной)

Если привысить диапазон указанные в PHP_INT_MIN и PHP_INT_MAX, то страшного ничего не произойдет. Просто PHP изменит его тип данных на float. Но стоит учитывать, что если ваш метод принимает только int, то тут могут возникать уже ошибки.

2. FLOAT - числа с плавающей запятой. В отличии от integer имеют больший диапазон и возможность хранения запятой. Диапазон примерно от ±1.8E-308 до ±1.8E+308. Подробнее можно узнать в константах языка PHP_FLOAT_MAX и PHP_FLOAT_MIN

Пример:

$price = 19.99;
$temperature = -5.5;
$pi = 3.14159;
$scientific = 1.2e3; // 1200

3. STRING - строковый тип данных.

Строки в отличии от числ записываются в PHP в одинарных или двойных кавычках. Это необходимо для того, чтобы интерпретатор мог различать где еще идет переменная, а где уже часть кода. В зависимости от того какие кавычки использовать, интерпретатор будет по разному из различать и по разному будет затрачиваться память на их хранение и обработку.

Пример:

$oneQuote = 'строка'; // одинарные кавычки
$twoQuote = "тоже строка"; // двойные кавычки

Использование одинарных или двойных кавычек зависит от цели переменной строки. Если это статическая строка, в которую не надо вставлять переменные и прочее, то лучше оставлять одинарные ковычки. Если часть данных в строке будет динамичной (подставляться из переменных), то стоит использовать двойные и то лишь ради удобства и чистоты кода.

Пример:

$part = 123;
$oneQuote = 'string' . $part; // использование с одинарными (выглядит страшно)
$twoQuote = "
string $part"; // выглядит красивее
$oneQuoteError = '
string $part'; // переменная не подставится и финальная строка будет `string $part` вместо `string 123`

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

4. BOOLEAN - логический тип данных. Может хранить только значения true и false.

Пример:

$foo = true;
$boo = false;

Помимо прямой записи еще можно получать из различных ситуация сравнений. Например $a === $b или же $count > 0 и прочих сравнений. Чаще всего используются в условиях if и циклах for, while, do while для реализации условной логики.

Пример:

$foo = true;
if ($foo) {
echo 'Это правда';
} else {
echo 'Это ложь';
}

Составные типы:

1. ARRAY - массивы. Позволяет хранить сразу группу значений. Может быть индексированным, ассоциативным и многомерным.

Пример:

// Индексированный массив
$fruits = ['apple', 'banana', 'orange'];
$numbers = array(1, 2, 3);

// Ассоциативный массив
$person = [
'name' => 'John',
'age' => 30,
'city' => 'Moscow'
];

// Многомерный массив
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];

На хранение массивов уходит много памяти и в связи с этим не обходится без различных хитростей. Например, у PHP есть свое правило передачи и обработки массивов.

При передаче переменных в функции, можно передавать только значения, что создаст аналогичную переменную (пример передачи: function (int $foo)) или ссылку (пример передачи: function (int &$foo)). В зависимости от передачи будет выбрано либо создастся копия переменной или будет использоваться она же. В случае с массивами создавать копию массива каждый раз будет оченьь сильно по памяти и поэтому есть небольшая хитрость. Если передать массив без ссылки, то PHP все равно передаст ссылку в функцию. Если в процессе работы функции значение массива будет изменено, то только тогда PHP создаст отдельную переменную. Это помогает избежать дублирование переменной во многих местах где она использутеся только для чтения или же передана была случайно.

2. OBJECT - экзепляры классов. Если у вас в коде есть какой-либо класс, то при создании его экзепляра в виде new SomeClass; он будет хранится как тип данных Object.

Пример:

class User {
public $name;
public $email;
public function __construct($name, $email)
{
$this->name = $name;
$this->email = $email;
}
}
$user = new User('Alice', 'alice@example.com'); // это объект

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

Пример:

$user = new User('Alice', 'alice@example.com');
$secondUser = clone $user;

Специальные типы:

1. NULL - предоставляет собой отсутствие значения у переменной. В большинстве случае считается как антипаттерн так как ВСЕГДА приходится обрабатывать возможное значение null;

Пример:

$user = User::getUserById(1); // тут может быть как объект, так и null

if (!$user) { // приходится обрабатывать случай когда его нету
throw new Exception('Пользователь не найден');
}

2. RESOUCE - Специальные указатели на внешние ресурсы. Этими ресурсами могут быть:

  • Файл (например через fopen)
  • Соединение с базой данных (например через mysqli_connect)
  • CURL
  • FTP

и так далее.

3. CALLABLE - Функции обратного вызова. Появился с 7 версии PHP. По сути не как тип данных как механизм передачи анонимных функций в качестве значений. Нужен для того, чтобы в процессе выполнения метода выполнить переданную функцию.

Пример:

$callback = function($name) {
return "Hello, $name!";
};
$result = $callback('John'); // "Hello, John!"

4. ITERABLE - Больше поход на интерфейс чем на тип данных. Также появился с 7 версии. По сути говорит "не важно что перадавать лишь бы это можно было обработать в цикле". Таким образом можно передавать как объекты, способные использовать в цикле, так и массивы или же генераторы.

Пример:

// Функция принимает iterable
function printItems(iterable $items) {
foreach ($items as $item) {
echo $item . "\n";
}
}
// Массив - это iterable
$array = ['яблоко', 'банан', 'апельсин'];
printItems($array);

На этом с типами данных в PHP все. В этом языке довольно мало типов. Во многих других языках есть другие типы, которые в PHP представлены в другом виде

  • CHAR - симольный тип. в PHP это всегда STRING
  • BYTE - байтовый тип. В PHP для этого используются числа INT
  • STRUCT - структуры данных. Для этого в PHP используются классы или массивы
  • POINTER - прямой указатель. PHP не поддерживает работу с указателями
  • Fixed-size arrays - Фиксированные массивы. В PHP они всегда динамичные

и многие другие типы данных