Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не отрабатывает return у метода.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: А echo срабатывает
Ruslan05
Отправлено: 18 Января, 2014 - 21:11:52
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




Имеется код следующей структуры

PHP:
скопировать код в буфер обмена
  1.  
  2. class Search
  3. {
  4.     public function search($dir, $mask)
  5.     {
  6.                 foreach(glob($dir.'/*') as $filename){
  7.                         if(stripos($filename, $mask)) {
  8.                                 return $filename;
  9.                         }
  10.                         elseif(is_dir($filename)) {
  11.                                 $this->search($filename, $mask);
  12.                         }
  13.                 }
  14.     }
  15. }
  16.  
  17. $search = new Search();
  18. echo $search->search($dir, "$mask");
  19.  


Метод рекурсивно обходит все папки и подпапки указанного каталога ($dir) и должен вернуть путь к файлу который содержит $mask в названии.

Не отрабатывает return $filename;
Хотя если вместо return использовать echo, то все нормально выводится.

В чем может быть проблема?

(Отредактировано автором: 18 Января, 2014 - 22:05:02)

 
 Top
OrmaJever Модератор
Отправлено: 18 Января, 2014 - 21:20:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Ruslan05 пишет:
В чем может быть проблема?

в том что строка
PHP:
скопировать код в буфер обмена
  1. $this->search($filename, $mask);

просто вызывается и у неё, то есть ваш метод вернул что-то и в этой строке оно улетело в никуда.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Ruslan05
Отправлено: 18 Января, 2014 - 21:52:51
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




OrmaJever пишет:
Ruslan05 пишет:
В чем может быть проблема?

в том что строка
PHP:
скопировать код в буфер обмена
  1. $this->search($filename, $mask);

просто вызывается и у неё, то есть ваш метод вернул что-то и в этой строке оно улетело в никуда.

Но почему функция продолжает работу, если сработал return?
Из документации php.net
"Если вызвано из функции, выражение return немедленно прекращает выполнение текущей функции и возвращает свой аргумент как значение данной функции"
 
 Top
OrmaJever Модератор
Отправлено: 18 Января, 2014 - 22:18:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




кто сказал что она продолжает работать, ведь этот ретурн не из основной функции, а из тех которые вызваны по рекурсии, они заканчиваются а их результат улетает в никуда и вы не видите ничего кроме поиска в родительском каталоге.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DelphinPRO
Отправлено: 18 Января, 2014 - 23:13:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Ruslan05 пишет:
Но почему функция продолжает работу, если сработал return?


CODE (text):
скопировать код в буфер обмена
  1. вызов_функции
  2.     рекурсивный_вызов
  3.         рекурсивный_вызов
  4.             рекурсивный_вызов      <- здесь сработал return
  5.         рекурсивный_вызов          // остальное по прежнему крутится
  6.             рекурсивный_вызов
  7.                 ...
  8.  

Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Ruslan05
Отправлено: 18 Января, 2014 - 23:23:04
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




DelphinPRO пишет:
Ruslan05 пишет:
Но почему функция продолжает работу, если сработал return?


CODE (text):
скопировать код в буфер обмена
  1. вызов_функции
  2.     рекурсивный_вызов
  3.         рекурсивный_вызов
  4.             рекурсивный_вызов      <- здесь сработал return
  5.         рекурсивный_вызов          // остальное по прежнему крутится
  6.             рекурсивный_вызов
  7.                 ...
  8.  

Улыбка

Ясно. Не буду заморачиваться с выходом из рекурсии.
Переписал метод на:
PHP:
скопировать код в буфер обмена
  1.  
  2. public function search($dir, $mask)
  3. {
  4.     $directory = new RecursiveDirectoryIterator($dir);
  5.     $iterator = new RecursiveIteratorIterator($directory);
  6.     foreach ($iterator as $splFileInfo) {
  7.         if ($splFileInfo->isFile() && stripos($splFileInfo->getFilename(), $mask))
  8.         {
  9.             return $splFileInfo->getPathname();
  10.         }
  11.     }
  12.     return false;
  13. }

Теперь работает как надо.

(Отредактировано автором: 19 Января, 2014 - 00:25:15)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Если скрипт не работает »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB