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