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;
}