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

Рассмотрим функцию ucfirst, которая делает заглавной первую букву переданной строки:

<?php

$house = 'bolton';
$newHouse = ucfirst($house);

print_r($newHouse);

На экран выведется строка Bolton.

Но что будет выведено на экран если вызвать print_r($house);? Выведется старое значение: bolton.

Функция ucfirst вернула новые данные, но не изменила переданные в неё данные. Она не могла это сделать физически, потому что примитивные типы в php — неизменяемы.

(Напомним, что примитивные типы — это простые типы, встроенные в сам язык программирования: например, число или строка).

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

Строка 'bolton' — это значение переменной $house, и саму строку нельзя изменить. Но переменная называется переменной, потому что её значение можно заменить на другое значение.

То есть мы можем написать:

<?php

$house = 'bolton';
$house = ucfirst($house);

print_r($house);

Сначала в переменную записывается одно значение, а потом в ту же переменную вместо предыдущего значения записывается новое: то, что вернет вызов ucfirst($house).

Строку $house = ucfirst($house); можно прочитать так: «записать в переменную $house то, что вернет вызов функции ucfirst если передать в неё текущее значение переменной $house».

Мы не изменили строку, мы изменили переменную — записали в неё новую строку вместо старой.

Изменение уже существующей переменной может показаться безобидным действием. Но в реальных программах переписывание переменной становится источником проблем. Код с изменяемыми переменными сложно понимать и анализировать: никогда нельзя быть уверенным, какое значение будет у переменной в какой-то момент времени.

Вы наверняка регулярно сталкиваетесь с багами и ошибками в приложениях, которые используете. Многие вызваны именно обилием изменяемых переменных: такие ошибки сложно найти и исправить.

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

Задание

Переведите строку, записанную в переменную $str, в верхний регистр используя функцию strtoupper. Новое значение запишите в ту же переменную $str.

Возможно, вам покажется, что код получился странным. Это типичный пример: переписывание переменных делает код менее понятным и более запутанным.

Exercise available only for signed users