Маніпуляції з типами

PHP не вимагає явного визначення типу при оголошенні змінної. Якщо тип змінної не вказано, він буде визначений значенням, яке вона зберігає. Тобто, якщо змінною $var присвоюється значення типу рядок (string), $var змінить тип на рядок (string). Якщо після цього змінної $var буде присвоєно значення типу ціле число (int), вона змінить тип на ціле число (int).

У ряді контекстів PHP може спробувати автоматично перетворити тип значення на інший. Існуючі контексти:

  • Числовий
  • Рядковий
  • Логічний
  • Контекст цілих чисел та рядків
  • Порівняльний
  • Контекст функцій

Зауваження: Коли значення потрібно інтерпретувати як інший тип, саме значення неменяет тип.

Про те, як примусово встановити тип змінної, розказано у розділі «Приведення типу». Про те, як змінити тип змінної, описано в описі функції settype()

Числовий контекст

Числовий контекст виникає під час роботи з арифметичними операторами

У цьому контексті, якщо один з операндів - число з плаваючою точкою (float) (або не інтерпретується як ціле число (int)), обидва операнда інтерпретуються як число з плаваючою точкою (float) і результатом буде число з плаваючою точкою (float). В іншому випадку операнди будуть інтерпретовані як ціле число (int) і результатом також буде ціле число (int). Починаючи з PHP 8.0.0, якщо один із операндів не може бути інтерпретований, викидається виняток TypeError

Рядковий контекст

Рядковий контекст виникає під час роботи з мовними конструкціями echo print, приінтерполяції рядківили строковомоператора конкатенації

У цьому контексті значення інтерпретуватиметься як рядок (string). Якщо значення не може бути інтерпретовано, викидається виняток TypeError. До версії PHP 7.4.0 видавалася помилка рівня E_RECOVERABLE_ERROR

Логічний контекст

Логічний контекст виникає під час роботи з умовними операторами, тернарним оператором або логічним оператором

У цьому контексті значення інтерпретуватиметься як логічне значення (bool).

Контекст цілих чисел та рядків

Контекст цілих чисел і рядків виникає під час роботи з побітовими операторами

У цьому контексті, якщо у всіх операндів є тип рядка (string), результат також буде рядком (string). В іншому випадку операнди будуть інтерпретовані як ціле число (int) і результат також буде цілим числом (int). Починаючи з PHP 8.0.0, якщо один із операндів не може бути інтерпретований, то буде викинуто виняток TypeError

Порівняльний контекст

Порівняльний контекст виникає при роботі з операторами порівняння

Перетворення типів, що відбуваються в цьому контексті, пояснено у таблиці порівняння типів розділу "Оператори порівняння".

Контекст функцій

Контекст функцій виникає, коли значення передається типізованим параметром, властивістю або повертається з функції, в якій оголошено тип значення, що повертається.

У цьому контексті значення має бути значенням типу. Є два винятки, перше: якщо тип значення - ціле число (int), а оголошений тип - число з плаваючою точкою (float), то ціле число перетворюється на число з плаваючою точкою. Другий: якщо оголошений тип – це скалярний тип, значення перетворюється на скалярний тип і режим суворої типізації активний (за замовчуванням), значення може бути перетворено на допустиме скалярне значення. Опис такої поведінки наведено нижче.

Увага

Вбудовані функції автоматично підставляють null до скалярних типів, це поведінка ЗАСТАРІЛОс PHP 8.1.0.

Примусова типізація із простим оголошенням типів

  • Оголошення типу bool: значення інтерпретується як логічне значення (bool).
  • Оголошення типу int: значення інтерпретується як ціле число (int), якщо перетворення надійно визначене. Наприклад, коли рядокчисловий рядок
  • Оголошення типу float: значення інтерпретується як число з плаваючою точкою (float), якщо перетворення надійно визначене. Наприклад, коли рядокчисловий рядок
  • Оголошення типу string: значення інтерпретується як рядок (string).

Примусова типізація з поєднанням типів

Когда директиваstrict_types не ввімкнено, оголошення скалярних типів підлягають обмеженому неявному наведенню типів. Якщо точний тип значення – не частина об'єднання, то цільовий тип вибраний зі списку в порядку зменшення пріоритету:

  1. int
  2. float
  3. string
  4. bool

Якщо тип і існує в об'єднанні та значення може бути приведено до цього типу відповідно до існуючої семантики перевірки типів PHP, то PHP вибирає цей тип. В іншому випадку буде вибрано наступний тип.

Застереження

Як виняток, якщо значення — рядок, а ціле число (int) і число з точкою (float) — це частина об'єднання, переважний тип буде визначений існуючою семантикою числового рядкаНаПриклад, для«42» PHP вибирає ціле число (int), а для «42.0» - Число з плаваючою точкою (float).

Зауваження :

Типи, які не входять до списку переваг, не стануть метою для неявного приведення. Говорячи конкретніше, ніякого неявного приведення до типів null, false і true не буде.

Приклад #1 Приклад примусового включення типів до об'єднання

Loading...

Приведення типів

Приведення типу перетворює значення до вибраного типу, записуючи тип у круглих дужках перед значенням, що перетворюється.

Loading...

Дозволено такі типи:

  • (int)- Приведення типу до цілого числа (int)
  • (bool)- Приведення типу до логічного значення (bool)
  • (float)— приведення типу до плаваючої точки (float)
  • (string)- Приведення типу до рядка (string)
  • (array)- Приведення типу до масиву (array)
  • (object)- Приведення типу до об'єкта (object)
  • (unset)- Приведення типу до NULL

Зауваження :

(integer)— псевдоним приведения типа(int). . (boolean)— псевдоним приведения типа(bool). . (binary)— псевдоним приведения типа(string). . (double)и(real) - псевдоніми приведення типу (float). Ці наведення не використовують канонічне ім'я типу і не рекомендуються.

Увага

Псевдоним приведения типа(real)устарел с PHP 8.0.0.

Увага

Приведение типа(unset)устарело с версии PHP 7.2.0. Обратите внимание, что приведение(unset) рівносильно присвоєння змінної або виклику значення NULL. Приведення (unset)удалено в PHP 8.0.0.

Застереження

Приведение типа(binary)и префиксb є для прямої підтримки. Типи (binary)и(string) ідентичні, однак, це може змінитись, не потрібно на це покладатися.

Зауваження :

PHP ігнорує прогалини у круглих дужках при наведенні типу. Тому такі два приведення типів еквівалентні:

Loading...

Приведення рядків (string) та змінних до бінарних рядків (string):

Loading...

Зауваження: Замість приведення змінної до типу рядок (string) можна також укласти змінну подвійні лапки.

Loading...

Можливо, очевидно, що станеться при перетворенні між різними типами. Отримати додаткову інформацію можна у розділах:

Зауваження: Оскільки PHP підтримує індексацію в рядках (string) через усунення, використовуючи той же синтаксис, що і індексація в масивах (array), наступний приклад справедливий для всіх версій PHP:

Loading...

Додаткову інформацію можна знайти в розділі «Доступ до символу в рядку та його зміна».