0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы реализуем функцию mysubstr(), которая извлекает из строки подстроку указанной длины.</p>
1
<p>В этом уроке мы реализуем функцию mysubstr(), которая извлекает из строки подстроку указанной длины.</p>
2
<p>Она принимает на вход два аргумента:</p>
2
<p>Она принимает на вход два аргумента:</p>
3
<ul><li>Строку</li>
3
<ul><li>Строку</li>
4
<li>Длину</li>
4
<li>Длину</li>
5
</ul><p>Эта функция возвращает подстроку, начиная с первого символа:</p>
5
</ul><p>Эта функция возвращает подстроку, начиная с первого символа:</p>
6
<p>Кажется, что все хорошо. Но наша функция содержит множество ошибок, потому что в ней не учтены так называемые<strong>пограничные случаи</strong>. Функция нормально работает только с нормальными аргументами. Но мы не знаем, как она поведет себя, если передать ей такие варианты длины:</p>
6
<p>Кажется, что все хорошо. Но наша функция содержит множество ошибок, потому что в ней не учтены так называемые<strong>пограничные случаи</strong>. Функция нормально работает только с нормальными аргументами. Но мы не знаем, как она поведет себя, если передать ей такие варианты длины:</p>
7
<ul><li>0</li>
7
<ul><li>0</li>
8
<li>Отрицательное число</li>
8
<li>Отрицательное число</li>
9
<li>Число, превышающее реальный размер строки</li>
9
<li>Число, превышающее реальный размер строки</li>
10
</ul><p>Функция mysubstr() не рассчитана на такие варианты. Можно подумать, что это не проблема: функция работает в нормальных условиях, и просто не нужно передавать ей "плохие аргументы".</p>
10
</ul><p>Функция mysubstr() не рассчитана на такие варианты. Можно подумать, что это не проблема: функция работает в нормальных условиях, и просто не нужно передавать ей "плохие аргументы".</p>
11
<p>В идеальном мире - да, но в реальном мире ваш код будет запускаться в разных ситуациях, с разными комбинациями условий и данных. Нельзя быть уверенным, что аргументы всегда будут корректными, поэтому нужно учитывать все случаи, в рамках здравого смысла.</p>
11
<p>В идеальном мире - да, но в реальном мире ваш код будет запускаться в разных ситуациях, с разными комбинациями условий и данных. Нельзя быть уверенным, что аргументы всегда будут корректными, поэтому нужно учитывать все случаи, в рамках здравого смысла.</p>
12
<p>Пограничные случаи - самая распространенная причина логических ошибок в программах. Программисты часто забывают что-нибудь учесть. Такие ошибки часто проявляются не сразу, и могут долгое время не приводить к видимым проблемам. Программа продолжает работать, но в какой-то момент обнаруживается, что в результатах есть ошибки.</p>
12
<p>Пограничные случаи - самая распространенная причина логических ошибок в программах. Программисты часто забывают что-нибудь учесть. Такие ошибки часто проявляются не сразу, и могут долгое время не приводить к видимым проблемам. Программа продолжает работать, но в какой-то момент обнаруживается, что в результатах есть ошибки.</p>
13
<p>Часто причина заключается в слабой типизации PHP. Умение справляться с такими ошибками приходит с опытом, через постоянные проблемы в стиле "Ой, забыл проверить на пустую строку!".</p>
13
<p>Часто причина заключается в слабой типизации PHP. Умение справляться с такими ошибками приходит с опытом, через постоянные проблемы в стиле "Ой, забыл проверить на пустую строку!".</p>
14
<p>Давайте представим себе расширенную функцию mysubstr(). Она принимает три аргумента:</p>
14
<p>Давайте представим себе расширенную функцию mysubstr(). Она принимает три аргумента:</p>
15
<ul><li>Строку</li>
15
<ul><li>Строку</li>
16
<li>Индекс</li>
16
<li>Индекс</li>
17
<li>Длину извлекаемой подстроки</li>
17
<li>Длину извлекаемой подстроки</li>
18
</ul><p>Функция возвращает подстроку указанной длины начиная с указанного индекса. Посмотрим примеры вызова:</p>
18
</ul><p>Функция возвращает подстроку указанной длины начиная с указанного индекса. Посмотрим примеры вызова:</p>
19
<p>Обсудим, что может пойти не так. Какие<strong>пограничные случаи</strong>стоит учитывать:</p>
19
<p>Обсудим, что может пойти не так. Какие<strong>пограничные случаи</strong>стоит учитывать:</p>
20
<ul><li>Отрицательная длина извлекаемой подстроки</li>
20
<ul><li>Отрицательная длина извлекаемой подстроки</li>
21
<li>Отрицательный заданный индекс</li>
21
<li>Отрицательный заданный индекс</li>
22
<li>Заданный индекс выходит за границу всей строки</li>
22
<li>Заданный индекс выходит за границу всей строки</li>
23
<li>Длина подстроки в сумме с заданным индексом выходит за границу всей строки</li>
23
<li>Длина подстроки в сумме с заданным индексом выходит за границу всей строки</li>
24
</ul><p>В реализации функции каждый пограничный случай будет отдельным куском кода, скорее всего реализованным с помощью if.</p>
24
</ul><p>В реализации функции каждый пограничный случай будет отдельным куском кода, скорее всего реализованным с помощью if.</p>
25
<p>Чтобы написать функцию mysubstr() и защититься от этих случаев, стоит написать отдельную функцию, которая будет проверять аргументы на корректность. Займемся этим в задании к этому уроку.</p>
25
<p>Чтобы написать функцию mysubstr() и защититься от этих случаев, стоит написать отдельную функцию, которая будет проверять аргументы на корректность. Займемся этим в задании к этому уроку.</p>