В PHP функция возвращает NULL вместо данных

Недавно столкнулся с такой вот проблемой. Написал на PHP небольшой код, который, при всей очевидной правильности, не работал и хоть ты тресни! Функция ни в какую не хотела возвращать должное значение, хотя выводила его исправно.

А теперь ближе к делу. вот примерно так выглядит тот самый код:

  1. function a()
  2. {
  3.     print(b());
  4. }
  5.  
  6. function b($c = 0)
  7. {
  8.     static $d = 0;
  9.  
  10.     if ($c == 0)
  11.     {
  12.         $c = 8;
  13.     }
  14.  
  15.     if ($d <= 2)
  16.     {
  17.         $d++;
  18.         if ($c <= 9)
  19.         {
  20.             $c++;
  21.             b($c);
  22.         }
  23.         else
  24.         {
  25.             return $c;
  26.         }
  27.     }
  28.     else
  29.     {
  30.         return $c;
  31.     }
  32. }

По плану я должен был получить на экране результат функции a(), а именно: возвращённое функцией b() значение переменной $c, которое, в результате работы функции b(), должно прийти к какому–то числовому значению, посчитайте сами к какому. :). Однако PHP мой план оказался не интересен и на экране я ничего не получил, а точнее — получил NULL.

Удивительное дело, но если конструкцию return $c; заменить на print($c);, то всё работает — на экране нужный результат. Но, к сожалению, у меня в функции a() были большие планы на этот результат и в таком виде его получать меня не устраивает.

И тут мы схлестнулись в неравной схватке: он — досконально знающий PHP, интерпретатор языка PHP и я — знающий бесконечно больше, чем он, всего, кроме PHP. Но оставим подробности эпической битвы и перейдём сразу к результату. А проблема как всегда решается элементарно:

  1. function a()
  2. {
  3.     print(b());
  4. }
  5.  
  6. function b($c = 0)
  7. {
  8.     static $d = 0;
  9.  
  10.     if ($c == 0)
  11.     {
  12.         $c = 8;
  13.     }
  14.  
  15.     if ($d <= 2)
  16.     {
  17.         $d++;
  18.         if ($c <= 9)
  19.         {
  20.             $c++;
  21.             return b($c);
  22.         }
  23.         else
  24.         {
  25.             return $c;
  26.         }
  27.     }
  28.     else
  29.     {
  30.         return $c;
  31.     }
  32. }

Для тех, кто не заметил разницы, поясняю. Функция b(), в месте своего рекурсивного вызова, не просто вызывается, а возвращается. Если этого не сделать, то return $c; вернёт результат, не как результат работы функции b(), вызванной из функции a(), а как результат работы функции b() на предпоследней итерации рекурсии. А на предпоследней итерации мы никакого результата не возвращали, поскольку полученный нас не устроил и мы запустили очередную итерацию рекурсии. А функция, которая ничего не возвращает, возвращает ничего, то–есть — NULL. Что и требовалось доказать.

Мораль сей басни такова: читайте мануалы! :)

Комментарии

1 год назад
спасибо, а то никак не мог забодать этот NULL.
Люблю вас! ;)
Комментировать