PHP - возвращает разные типы значений из одного метода - PullRequest
3 голосов
/ 15 июля 2010

будет плохой практикой возвращать разные типы из одного и того же метода в php.Может быть, есть лучший шаблон для этого, но, по сути, я хочу, чтобы мой метод что-то сделал, и если он потерпит неудачу, вернет строковое сообщение об ошибке, но если это сработает, вернет истину.Мне кажется, это не совсем правильно, но единственный способ, с помощью которого я смогу выполнить эту работу, - это вернуть строку для сообщения об ошибке и строку с чем-то вроде «works» или «valid» или чем-то, если все пойдет нормально.Опять же, это означает, что существует больше связей между методами, которые используют это, поскольку они не могут просто проверить true для false, но должны знать слово, которое будет представлять действительный ответ от метода.

Ответы [ 6 ]

2 голосов
/ 15 июля 2010

Предполагая, что вы ссылаетесь на метод в классе, было бы лучше просто вернуть TRUE или FALSE из метода, но использовать свойство $ _error в классе, которое может содержать массив сообщений об ошибках.

Тогда, если результат равен false, перед возвратом метод может установить сообщение (я) об ошибке в свойстве $ _error, и вы можете получить сообщение, используя метод get_error ().

2 голосов
/ 15 июля 2010

Если вы пытаетесь отслеживать работоспособность функции, вам лучше всего использовать исключения. Как и во всех языках программирования, которые их предоставляют, они указывают на «исключительные» случаи, выходящие за пределы ожидаемого потока программы, и не требуют какого-либо возврата, чтобы указать, что что-то пошло не так. См. Связанную документацию, связанную ниже для специфики PHP.

Исключения PHP

0 голосов
/ 15 июля 2010

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

Например, mysql_query() возвращает ресурс в случае успеха и логическое значение false в случае ошибки. Вы проверяете состояние ошибки, а затем вызываете другую функцию, например mysql_error(), чтобы получить конкретную информацию о природе ошибки.

$query = mysql_query($sql);
if ($query === false) {
  die(mysql_error());
}

Однако при написании ОО-кода я бы с осторожностью возвращал из функции разные несвязанные типы объектов. От разработчиков требуется написать много утомительного кода для проверки типов:

$result = $search->find($keyword);

if ($result === null) {
  // no entry matches $id
} elseif ($result instanceof ResultClass) {
  // one row found; do something with the result
  print $result;
} elseif ($result instanceof ResultCollection) {
  foreach ($result as $element) {
    print $element;
  }
} else {
  // are there other types for $result?
}

Какая боль писать весь этот код каждый раз, когда вы звоните find()!

В вышеприведенном примере было бы лучше, если бы метод find() всегда возвращал ResultCollection. Если результаты не найдены, коллекция будет иметь нулевые записи. Если вы можете предположить, что функция возвращает данный тип последовательно, ваш код проще:

$result = $search->find($keyword);
foreach ($result as $element) {
  print $element;
}
0 голосов
/ 15 июля 2010

Возвращение true или что-то еще может быть хорошим решением.Иногда.Я не могу сломаться, если вы решите изменить возвращаемые значения.Лично мне это нравится.

Вы можете вернуть массив.Если он пуст, ошибки не было.Каждая ошибка будет отдельным элементом в массиве.

Кроме того, вы можете попробовать выдать исключение .

0 голосов
/ 15 июля 2010

Вы можете сойти с рук в PHP, но это может вызвать проблемы в будущем.Esp, когда вы или кто-то еще должен поддерживать приложение в будущем.В общем, я бы рекомендовал избегать любого подхода, подобного этому, который создает двусмысленность в отношении того, что находится в переменной.

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

ex:

   $msg = MyFunc( $o);
    if ($msg == 'OK')   //or ($msg == 0)
    {
        //use the returned object or value
        $o->Foo();
    }
    else
    {
        //respond to error
    }
0 голосов
/ 15 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...