HTML Diff
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>