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
Форумы портала PHP.SU :: Версия для печати :: Вернуть ошибку и false
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Вернуть ошибку и false

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

1. jonston - 04 Мая, 2011 - 20:28:14 - перейти к сообщению
Здравствуйте форумчане!Скажите как сделать чтобы функция возвращала $error и false одновременно?Спасибо!
что типа этого:
PHP:
скопировать код в буфер обмена
  1.  
  2. function return_dbl($a = '3')
  3. {
  4.     if($a == '3')
  5.     {
  6.         $error = 'произошла ошибка!';
  7.         return false;
  8.         return $error;        
  9.     }
  10. }
  11.  
2. EuGen - 04 Мая, 2011 - 20:29:36 - перейти к сообщению
return array('result'=>false, 'error'=>$error);
3. jonston - 04 Мая, 2011 - 20:36:40 - перейти к сообщению
EuGen пишет:
return array('result'=>false, 'error'=>$error);

если мне нужно проверить
PHP:
скопировать код в буфер обмена
  1.  
  2. if( ! return_dbl('3')) echo $error;
  3.  

так по моему не прокатит.Или я не прав?
4. EuGen - 04 Мая, 2011 - 20:42:35 - перейти к сообщению
Проверяйте так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $rgResult=return_dbl('3');
  3. if(!$rgResult['result'])
  4. {
  5.    echo($rgResult['error']);
  6. }
  7.  
5. jonston - 04 Мая, 2011 - 20:55:15 - перейти к сообщению
EuGen пишет:
Проверяйте так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $rgResult=return_dbl('3');
  3. if(!$rgResult['result'])
  4. {
  5.    echo($rgResult['error']);
  6. }
  7.  

спасибо за ответ!Но все таки в codeigniter как-то можно напрямую получать ошибку и false
я даже не знаю как они это сделали.
6. EuGen - 04 Мая, 2011 - 22:21:23 - перейти к сообщению
Для того, чтобы вернуть два значения их нужно преобразовать в структуру. Другого способа нет, так как само понятие функции подразумевает возвращение одного единственного результата (или, как частность, не возвращение ничего)
7. OrmaJever - 04 Мая, 2011 - 22:44:23 - перейти к сообщению
ну а зачем 2 значения если одно из них булевое?
PHP:
скопировать код в буфер обмена
  1. function return_dbl($a = '3')
  2. {
  3.     $error = false;
  4.     if($a == '3') $error = 'произошла ошибка!';
  5.     return $error;
  6. }
  7.  
  8. if(return_dbl() !== false) echo return_dbl();
  9. // либо так, чтобы не вызывать функцию 2раза
  10. $err = return_dbl();
  11. if($err !== false) echo $err;
8. grefon - 05 Мая, 2011 - 03:36:25 - перейти к сообщению
Так а Вы сделайте $error глобальной переменной и в функции возвращайте только false. Но это только если структура скрипта позволяет.
9. EuGen - 05 Мая, 2011 - 08:56:53 - перейти к сообщению
grefon пишет:
Так а Вы сделайте $error глобальной переменной

Плохая идея. В идеальном случае нет вообще никаких side-effect (глобальные переменные, неявное изменение параметров функций и т.п.). Очень рекомендую никогда не использовать глобальные переменные.
10. OrmaJever - 05 Мая, 2011 - 10:29:01 - перейти к сообщению
Ещё тогда вариант передавать переменю по ссылке
11. Stierus - 05 Мая, 2011 - 10:36:47 - перейти к сообщению
используйте исключения что бы передавать сообщения об ошибках. У функции должны быть строго определены параметры и ответы. У одной ф-и может быть лишь 1 тип ответа - булевое значение, массив или строка - не важно, важно , что не в функции не должно быть кейсов, когда отдаются разные типы данных (в одном случае возвращается массив, а если ошибка - то false - это плохо, при ошибке должен происходить throw)
PHP:
скопировать код в буфер обмена
  1. function login(){
  2.    if($error){
  3.       throw new Exception('в логине недопустимые символы');
  4.    }
  5. }
  6.  
  7. //блок, использующий ф-ю:
  8. try{
  9.    $user = login();
  10. }
  11. catch(Exception $exception){
  12.    $message = $exception->getMessage();
  13.    //Сам факт того, что мы тут оказались говорит о ошибке
  14. }


в нормальных системах работает эта схема + исключения разных типов (от exception наследуются AuthException, DbException и тд - что бы можно было разные исключения отлавливать на разных уровнях)
12. EuGen - 05 Мая, 2011 - 10:53:50 - перейти к сообщению
OrmaJever пишет:
Ещё тогда вариант передавать переменю по ссылке

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

Правильнее всего предлагает Stierus, вот только думаю, что не скоро еще автор темы дойдет до прочтения о правильной обработке исключений.
13. jonston - 05 Мая, 2011 - 11:33:37 - перейти к сообщению
всем спасибо!Использую первый вариант Евгения!

 

Powered by ExBB FM 1.0 RC1