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) значения. Функции не меняют переданные им строки и числа, а возвращают новые значения. Любые «изменения» происходят путем создания нового значения и переопределения переменной.
Задание
В трех именах участников спрятано секретное слово. Составьте и выведите его из символов в таком порядке:
- Второй символ из первой строки
- Третий символ из третьей строки
- Третий символ из второй строки
- Седьмой символ из второй строки
- Пятый символ из второй строки
Попробуйте использовать интерполяцию: внутри фигурных скобок можно помещать не только целые переменные, но и отдельные символы с помощью квадратных скобок.
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) значения. Функции не меняют переданные им строки и числа, а возвращают новые значения. Любые «изменения» происходят путем создания нового значения и переопределения переменной.
Задание
В трех именах участников спрятано секретное слово. Составьте и выведите его из символов в таком порядке:
- Второй символ из первой строки
- Третий символ из третьей строки
- Третий символ из второй строки
- Седьмой символ из второй строки
- Пятый символ из второй строки
Попробуйте использовать интерполяцию: внутри фигурных скобок можно помещать не только целые переменные, но и отдельные символы с помощью квадратных скобок.
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\DataTypes\DataTypesImmutability;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$expected = 'print';
$this->assertOutput($expected);
}
}Решение учителя откроется через:
20:00
