Мысль дня

Если лошадь говорит тебе, что ты сумашедший — то так оно и есть!

В 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. Что и требовалось доказать.

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

Комментарии

7 лет назад
спасибо, а то никак не мог забодать этот NULL.
6 лет назад
Люблю вас! ;)
4 года назад
Спасибо тебе огромное. Рекурсия - сложная штука...
3 года назад
прям огромный респект )) для начинающего это было не легко найти понять как и откуда возвращать перезапуская функцию одну и ту же из внутри ))

Архив

  1. 2022
    1. август
      1. Сайт восстановил работу
  2. 2021
    1. январь
      1. Kubntu Linux Opera: не работает видео
      2. Не обновляется FreeBSD со старой версии, ошибка «Cowardly»
  3. 2015
    1. сентябрь
      1. Ворона позирует
      2. Как сделать новость из ничего
    2. август
      1. Моё первое селфи
      2. Спам от Майкрософта
    3. июнь
      1. 1000
      2. Сельдерей
    4. май
      1. Сирень зацвела
      2. Ночное солнце
    5. апрель
      1. Ить-ить-ить-ить
    6. январь
      1. Разрыв VPN-соединения при нагрузке
  4. 2014
    1. декабрь
      1. Суровый холостяцкий смайл
    2. ноябрь
      1. Перечень IP–адресов в IPFW
      2. Длина строки правила IPFW во FreeBSD
    3. октябрь
      1. Свет в конце тоннеля
      2. Огоньки
    4. сентябрь
      1. Попал под раздачу
      2. Собираю чемодан
      3. Чьи–то уши торчат над холмом
      4. Увеличение свободного места на телефоне LG P500 Optimus One
      5. Места нет, но место есть
      6. Пластиковая Африка
    5. август
      1. Кошка в ванной
      2. В PHP функция возвращает NULL вместо данных
      3. В Оперу вернулись закладки!
      4. Убираем рамки вокруг экрана
      5. Загадочный дом
    6. июль
      1. Божьи коровы и прочие твари
      2. Человек собаке друг
    7. июнь
      1. Котоворот
      2. Древесная живность
      3. Шампунь
    8. апрель
      1. Еда
      2. Смайл
      3. Одуванчики
      4. Шашлычная история
      5. Кровавая Луна
      6. Старый пень
      7. Бриллиант
    9. март
      1. Лисапет наносит ответный удар
      2. Весна пришла или Лисапет 2
      3. Лисапет
      4. Запах весны
    10. январь
      1. Восстановление данных и лечение HDD с помощью dd во FreeBSD
      2. Новогодняя ёлка 2014
  5. 2013
    1. декабрь
      1. Ледяные короны
      2. Луна
    2. ноябрь
      1. Тарас Шевченко - І виріс я на чужині
      2. Увеличение раздела диска во FreeBSD
      3. Одна особенность работы freebsd-update
    3. октябрь
      1. Обзор телефона LG P500 Optimus One
      2. Призрачная трава
    4. сентябрь
      1. Подарок
      2. Мокрая, как мышь
      3. Пластиковое нашествие
      4. Использование переменных в шаблоне REGEXP
    5. август
      1. Файл конфигурации MPlayer
      2. Микширование аудиоканалов в MPlayer
      3. Спамеры тоже люди
      4. Распятый мексиканец
      5. Подсолнуховое море
      6. Подложили свинью
      7. Глобальное обновление
    6. апрель
      1. Завтрак
    7. март
      1. Пересылка всей почты другому пользователю
    8. январь
      1. Задолбали ссылки
      2. Xerox Phaser 6000 против Linux x86_64
  6. 2012
    1. декабрь
      1. Изогнутый айфон
    2. октябрь
      1. Собака бывает кусачей
    3. июнь
      1. Поддержка Monkey's Audio в Linux
      2. Поддержка чересстрочного VC–1 в 64–битном линуксе
      3. Моя кошка ловит мушку
      4. Диапазон IP–адресов в IPFW
    4. май
      1. Задушила меня жаба
    5. февраль
      1. Как закрыть и открыть порты во FreeBSD
    6. январь
      1. Обмен данными между скриптами shell и PHP
  7. 2011
    1. декабрь
      1. Пасхальное яйцо в Muon
    2. ноябрь
      1. Windows XP и NFS
      2. От природы не уйдёшь
    3. октябрь
      1. Swappiness
      2. Бодания с Ubuntu 11.10
      3. Подпишись, не будь упырём!
      4. Установка Ubuntu на RAID 0
      5. Кодинг на сон грядущий
    4. сентябрь
      1. Аську! Больше асек!
      2. Разбитое сердце
      3. Привет из параллельной вселенной
      4. Карточный домик
    5. август
      1. Обзор ноутбука ASUS 1215B
    6. июль
      1. Работает–ли компьютер без видеокарты?
    7. июнь
      1. Частушка на злободневную тему
    8. май
      1. Как–то в прошлой жизни…
    9. март
      1. 8 марта
      2. Планшеты
      3. Цветы
  8. 2010
    1. декабрь
      1. Типа динамическая маршрутизация
    2. ноябрь
      1. Закрытые порты или бодания с FreeBSD
      2. Мой новый старый комп
      3. Глюк с кодировкой в MySQL
      4. Ёжик в тумане
    3. август
      1. Кукурузное счастье
    4. май
      1. День победы 2010
      2. Не пора–ли менять браузер?
      3. Оптимизация дисковой системы в Linux
  9. 2009
    1. ноябрь
      1. Перенос системы на другой жёсткий диск
    2. август
      1. Выбор HTML–редактора под линукс
      2. Сходим в оперу?
      3. Линукс
      4. 4:00
    3. июль
      1. Семантичеcкие URL
      2. Браузеры под раздачей
      3. Графика
      4. Достало!
      5. Где–то там море
      6. С чего всё началось
      7. Начало

Поддержка проекта

Поделиться

Комментировать