/
Программирование
/
Курс PHP
/

Неизменяемость примитивных типов

PHP: Неизменяемость примитивных типов

Представим, что у нас есть строка, и мы хотим сделать все буквы в ней большими. В PHP для этого есть встроенная функция strtoupper():

<?php

$firstName = 'Alexander';
print_r(strtoupper($firstName)); // => ALEXANDER

Может показаться, что функция изменила нашу строку. Проверим:

<?php

print_r($firstName); // => Alexander

Переменная осталась прежней. Функция strtoupper() не меняет исходную строку — она возвращает новую строку, составленную из больших букв. Так в PHP работают все функции для работы со строками: само значение после создания изменить нельзя. Программисты говорят, что такие значения неизменяемые (или иммутабельные).

Почему значения неизменяемые?

Примитивные значения в PHP (строки, числа, логические значения) ведут себя как значения в математике: число 5 нельзя «отредактировать», можно только получить из него новое число. Это дает важные преимущества:

  • Безопасность: значения не изменятся случайно
  • Производительность: с неизменяемыми значениями интерпретатору проще работать
  • Предсказуемость: меньше неожиданных эффектов при передаче данных в функции

А как тогда изменить строку?

Если нужно «изменить» строку, создается новая строка и сохраняется в ту же переменную:

<?php

$firstName = 'Alexander';
$firstName = strtoupper($firstName);

print_r($firstName); // => ALEXANDER

Переменная $firstName теперь просто хранит другую строку. Происходит замена значения переменной, а сама строка 'Alexander' остается нетронутой.

$firstName = 'Alexander'

strtoupper($firstName)  →  'ALEXANDER'   ←  создана новая строка
$firstName              →  'Alexander'   ←  исходная не изменилась

$firstName = strtoupper($firstName)
└──────────────┬───────────────────┘
   в переменной теперь новая строка

Важно различать две вещи: изменение значения переменной и изменение самого значения. Значение переменной можно заменить без проблем, а вот само значение — строку, число — изменить нельзя.

Новая переменная или та же?

Переиспользовать переменную стоит только тогда, когда речь идет об одной и той же сущности. Если пользователь ввел новое имя, это уже другая сущность, и лучше создать отдельную переменную:

<?php

// Одна и та же строка, просто обновляем
$name = 'Alexander';
$name = 'Blexander';

// Разные сущности, лучше разные переменные
$firstName = 'Alexander';
$correctedFirstName = 'Blexander';

Попытка «запихать» все строки в одну переменную запутывает код. Переменная перестает говорить, что в ней хранится.

Вывод

Примитивные типы данных в PHP (строки string, целые числа int, вещественные числа float и логические значения bool) ведут себя как неизменяемые (immutable) значения. Функции не меняют переданные им строки и числа, а возвращают новые значения. Любые «изменения» происходят путем создания нового значения и переопределения переменной.

Задание

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

  1. Второй символ из первой строки
  2. Третий символ из третьей строки
  3. Третий символ из второй строки
  4. Седьмой символ из второй строки
  5. Пятый символ из второй строки

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

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются