Недавно столкнулся с такой вот проблемой. Написал на PHP небольшой код, который, при всей очевидной правильности, не работал и хоть ты тресни! Функция ни в какую не хотела возвращать должное значение, хотя выводила его исправно.
А теперь ближе к делу. вот примерно так выглядит тот самый код:
- function a()
- {
- print(b());
- }
- function b($c = 0)
- {
- static $d = 0;
- if ($c == 0)
- {
- $c = 8;
- }
- if ($d <= 2)
- {
- $d++;
- if ($c <= 9)
- {
- $c++;
- b($c);
- }
- else
- {
- return $c;
- }
- }
- else
- {
- return $c;
- }
- }
По плану я должен был получить на экране результат функции a(), а именно: возвращённое функцией b() значение переменной $c, которое, в результате работы функции b(), должно прийти к какому–то числовому значению, посчитайте сами к какому. :). Однако PHP мой план оказался не интересен и на экране я ничего не получил, а точнее — получил NULL.
Удивительное дело, но если конструкцию return $c; заменить на print($c);, то всё работает — на экране нужный результат. Но, к сожалению, у меня в функции a() были большие планы на этот результат и в таком виде его получать меня не устраивает.
И тут мы схлестнулись в неравной схватке: он — досконально знающий PHP, интерпретатор языка PHP и я — знающий бесконечно больше, чем он, всего, кроме PHP. Но оставим подробности эпической битвы и перейдём сразу к результату. А проблема как всегда решается элементарно:
- function a()
- {
- print(b());
- }
- function b($c = 0)
- {
- static $d = 0;
- if ($c == 0)
- {
- $c = 8;
- }
- if ($d <= 2)
- {
- $d++;
- if ($c <= 9)
- {
- $c++;
- return b($c);
- }
- else
- {
- return $c;
- }
- }
- else
- {
- return $c;
- }
- }
Для тех, кто не заметил разницы, поясняю. Функция b(), в месте своего рекурсивного вызова, не просто вызывается, а возвращается. Если этого не сделать, то return $c; вернёт результат, не как результат работы функции b(), вызванной из функции a(), а как результат работы функции b() на предпоследней итерации рекурсии. А на предпоследней итерации мы никакого результата не возвращали, поскольку полученный нас не устроил и мы запустили очередную итерацию рекурсии. А функция, которая ничего не возвращает, возвращает ничего, то–есть — NULL. Что и требовалось доказать.
Мораль сей басни такова: читайте мануалы! :)