0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы поближе познакомимся с типами данных и обсудим нюансы работы с ними.</p>
1
<p>В этом уроке мы поближе познакомимся с типами данных и обсудим нюансы работы с ними.</p>
2
<p>Когда мы пишем на PHP, то не особо задумываемся над типами данных. Мы просто пишем код и ожидаем, что данные будут соответствовать нашим ожиданиям:</p>
2
<p>Когда мы пишем на PHP, то не особо задумываемся над типами данных. Мы просто пишем код и ожидаем, что данные будут соответствовать нашим ожиданиям:</p>
3
<p>Функция выше ожидает на вход строку. Это видно по тому, как используется переменная $name. А что, если мы ошибемся и передадим массив? Давайте попробуем:</p>
3
<p>Функция выше ожидает на вход строку. Это видно по тому, как используется переменная $name. А что, если мы ошибемся и передадим массив? Давайте попробуем:</p>
4
<p>Код отработает, но результат не будет соответствовать нашим ожиданиям. Ничего страшного в таком поведении нет - это просто цена за использование динамической типизации.</p>
4
<p>Код отработает, но результат не будет соответствовать нашим ожиданиям. Ничего страшного в таком поведении нет - это просто цена за использование динамической типизации.</p>
5
<p>В тех местах, где входной тип особенно важен, можно добавить соответствующую проверку и генерировать исключение, если переданы неверные данные. По крайней мере так делали раньше, до введения в язык механизма<strong>type hinting</strong>.</p>
5
<p>В тех местах, где входной тип особенно важен, можно добавить соответствующую проверку и генерировать исключение, если переданы неверные данные. По крайней мере так делали раньше, до введения в язык механизма<strong>type hinting</strong>.</p>
6
<p><strong>Type Hinting</strong>- это механизм, который позволяет явно указывать типы параметров. Интерпретатор использует их и применяет исключение в тех ситуациях, когда тип не соответствует ожидаемому. Так работает в большинстве языков, где присутствует этот механизм.</p>
6
<p><strong>Type Hinting</strong>- это механизм, который позволяет явно указывать типы параметров. Интерпретатор использует их и применяет исключение в тех ситуациях, когда тип не соответствует ожидаемому. Так работает в большинстве языков, где присутствует этот механизм.</p>
7
<p>В PHP используется слабая типизация, поэтому здесь все чуть сложнее. Можно жестко указать тип int, но это не значит, что интерпретатор начнет ругаться на все остальное. Он выполнит автоматическое приведение и спокойно обработает и логический, и строковый тип данных.</p>
7
<p>В PHP используется слабая типизация, поэтому здесь все чуть сложнее. Можно жестко указать тип int, но это не значит, что интерпретатор начнет ругаться на все остальное. Он выполнит автоматическое приведение и спокойно обработает и логический, и строковый тип данных.</p>
8
<p>Чтобы объявить тип аргумента, необходимо перед его именем добавить имя требуемого типа:</p>
8
<p>Чтобы объявить тип аргумента, необходимо перед его именем добавить имя требуемого типа:</p>
9
<p>Попробуем в качестве типа аргумента передать строку string:</p>
9
<p>Попробуем в качестве типа аргумента передать строку string:</p>
10
<p>Теперь ошибка совсем другая - нам явно говорят, что типы не сошлись. Увидеть и исправить подобную ошибку уже значительно легче. Рассмотрим еще один пример с несколькими параметрами:</p>
10
<p>Теперь ошибка совсем другая - нам явно говорят, что типы не сошлись. Увидеть и исправить подобную ошибку уже значительно легче. Рассмотрим еще один пример с несколькими параметрами:</p>
11
<p>Обратите внимание на отсутствие типа у $default. Значение по умолчанию может быть абсолютно любым, поэтому тип не указывается.</p>
11
<p>Обратите внимание на отсутствие типа у $default. Значение по умолчанию может быть абсолютно любым, поэтому тип не указывается.</p>
12
<p>Null не похож на другие типы данных и ведет себя особым образом. Дело в том, что типы данных в PHP не являются<strong>nullable</strong>- то есть они не допускают значение Null.</p>
12
<p>Null не похож на другие типы данных и ведет себя особым образом. Дело в том, что типы данных в PHP не являются<strong>nullable</strong>- то есть они не допускают значение Null.</p>
13
<p>Представим, что мы ждем на вход значение определенного типа - например, строку. В PHP строка не может иметь значение Null. Но это ограничение можно обойти. Можно указать значение, по умолчанию равное Null, и тогда указанный тип становится<em>nullable</em>- появится возможность передавать Null снаружи.</p>
13
<p>Представим, что мы ждем на вход значение определенного типа - например, строку. В PHP строка не может иметь значение Null. Но это ограничение можно обойти. Можно указать значение, по умолчанию равное Null, и тогда указанный тип становится<em>nullable</em>- появится возможность передавать Null снаружи.</p>
14
<p>Посмотрим, как это выглядит в коде:</p>
14
<p>Посмотрим, как это выглядит в коде:</p>
15
<p><strong>Не nullable</strong>:</p>
15
<p><strong>Не nullable</strong>:</p>
16
<p><strong>Nullable</strong>:</p>
16
<p><strong>Nullable</strong>:</p>
17
<p>Начиная с версии PHP 7.2, в языке появилась возможность указывать тип не только для входящих параметров, но и для возврата функции. Оно записывается через двоеточие после закрывающей скобки:</p>
17
<p>Начиная с версии PHP 7.2, в языке появилась возможность указывать тип не только для входящих параметров, но и для возврата функции. Оно записывается через двоеточие после закрывающей скобки:</p>
18
<p>Если мы ошибемся в теле функции выше и вернем строку, то интерпретатор скажет об этом:</p>
18
<p>Если мы ошибемся в теле функции выше и вернем строку, то интерпретатор скажет об этом:</p>
19
<p>Еще функция может ничего не возвращать. Например, если она принимает строку, добавляет в конец восклицательный знак и затем печатает результат на экран:</p>
19
<p>Еще функция может ничего не возвращать. Например, если она принимает строку, добавляет в конец восклицательный знак и затем печатает результат на экран:</p>
20
<p>Чтобы показать, что функция ничего не возвращает, нужно написать в ее сигнатуре после двоеточия - void.</p>
20
<p>Чтобы показать, что функция ничего не возвращает, нужно написать в ее сигнатуре после двоеточия - void.</p>
21
<h2>Строгие типы</h2>
21
<h2>Строгие типы</h2>
22
<p>В его базовом варианте Type Hinting не очень помогает выявить ошибки типов. Он больше полезен в качестве документации и подсказок в редакторе.</p>
22
<p>В его базовом варианте Type Hinting не очень помогает выявить ошибки типов. Он больше полезен в качестве документации и подсказок в редакторе.</p>
23
<p>Но в PHP есть специальная директива, включающая режим строгой проверки:</p>
23
<p>Но в PHP есть специальная директива, включающая режим строгой проверки:</p>
24
<p>В таком варианте не происходит автоматического преобразования типов. PHP выполняет точную проверку и выводит ошибку, если типы не совпали.</p>
24
<p>В таком варианте не происходит автоматического преобразования типов. PHP выполняет точную проверку и выводит ошибку, если типы не совпали.</p>
25
<h2>Типы значений, допускающие значение NULL</h2>
25
<h2>Типы значений, допускающие значение NULL</h2>
26
<p>Если поставить знак ? перед названием типа данных, то он помечается как<strong>обнуляемый</strong>- то есть допускающий значение Null.</p>
26
<p>Если поставить знак ? перед названием типа данных, то он помечается как<strong>обнуляемый</strong>- то есть допускающий значение Null.</p>
27
<p>Это значит, что значение может быть как указанного типа, так и null. Это работает как для входных параметров, так и для возвращаемых функцией значений:</p>
27
<p>Это значит, что значение может быть как указанного типа, так и null. Это работает как для входных параметров, так и для возвращаемых функцией значений:</p>
28
<p>Запись выше означает, что функция isPersonMrSmith() может принять в качестве параметра строку или null.</p>
28
<p>Запись выше означает, что функция isPersonMrSmith() может принять в качестве параметра строку или null.</p>
29
<p>Стоит сказать, что null должен быть передан явно - isPersonMrSmith(null). Иначе интерпретатор выдаст ошибку:</p>
29
<p>Стоит сказать, что null должен быть передан явно - isPersonMrSmith(null). Иначе интерпретатор выдаст ошибку:</p>
30
<p>Посмотрим, как ? работает с типом возвращаемого значения:</p>
30
<p>Посмотрим, как ? работает с типом возвращаемого значения:</p>
31
<p>Функция getName() принимает переменную $person. Затем функция должна вернуть строку с именем человека. Но иногда строки с именем нет - тогда возвращается null.</p>
31
<p>Функция getName() принимает переменную $person. Затем функция должна вернуть строку с именем человека. Но иногда строки с именем нет - тогда возвращается null.</p>