#php #class-design
#php #дизайн класса
Вопрос:
На самом деле это философский вопрос. Прошел год, как я программирую, используя PHP как язык, и, как все вы знаете, PHP очень либеральен в отношении типов данных. Мне было интересно: учитывая это, является ли хорошей практикой разрешать методам возвращать значения другого типа? Пример: я привык устанавливать переменную, которая должна быть возвращена со значением по умолчанию (обычно false), и, если во время выполнения метода все идет хорошо, переменная получает значение, данное успешным выполнением. Отказ от ответственности: я пытаюсь документировать все с помощью PHPDoc.
Комментарии:
1. Многие встроенные функции PHP делают то же самое. Возврат
false
или другого ресурса.2. Я чувствую, что это полезная функция PHP. Если вы хорошо это документируете, имеет смысл сделать это для функций, которые могут пойти не так (например, стандартный поиск в базе данных), чтобы корректно завершиться сбоем.
Ответ №1:
Кажется правильным подходом: возврат логического значения false позволяет методу / функции возвращать другие логические значения «false», такие как 0 или пустую строку, как допустимые, при этом позволяя вызывающей стороне проверять свой результат с помощью ===
оператора.
Ответ №2:
Это распространенный подход, по крайней мере, в PHP, и это неплохая практика.
Это может быть без проблем задокументировано с использованием соглашения PHPDoc: http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.return.pkg.html
Ответ №3:
Мне было интересно: учитывая это, является ли хорошей практикой разрешать методам возвращать значения другого типа?
Нет, это не так. Ни в PHP, ни в других языках. Лучше добавьте другой метод для определенного типа результатов.
Комментарии:
1. Можете ли вы пояснить, почему это так? Я часто отправляю обратно либо строку, либо false, которые представляют собой разные типы данных. Вы хотите сказать, что теперь я должен отправить обратно пустую строку или, например, строку с успехом? Кажется, гораздо проще иметь возможность использовать if (!$string) вместо if (!empty($string)) или if ($num < 1) или… и т.д. в зависимости от типа данных.
2. powtac, звучит так, как будто вы хотите ввести статическую типизацию на динамическом языке. Если вы чувствуете необходимость в таком правиле, не было бы лучше использовать язык, который обеспечивает его соблюдение с помощью технических средств?
3. @linusU2982 Как выглядит ваш код при вызове функции, которая возвращает разные типы?
4. Возвращаемые типы должны иметь общий интерфейс, как в примере OP — их оба можно сравнить с FALSE .
5. Да, возможно, но вы добавляете что-то вроде if () вокруг них вместо того, чтобы переносить эту маленькую логику в метод… Но, конечно, вы можете возвращать разные типы, … Я не рекомендую это.