PHP несколько функций, возвращаемых типов String|int

Я столкнулся с немного необычным сценарием, когда моя функция возвращает несколько типов string or integer, Я пытаюсь объявить типы возвращаемых данных. Может ли кто-нибудь предложить мне наилучшую практику, чтобы объявить.

Я знаю, что нуль или другой тип, я могу использовать что-то вроде этого

/**
 * Get the result status as a formatted string
 * @return string|null formatted status
 */
public function abStatus() : ?string {

но моя функция, как показано ниже, возвращает строку или целое число

/**
 * Get the score for this action
 * @return string|int
 */
public function getAlphaScore() {
    if ($this->type != self::TYPE_ACTION) {
        return 0;
    }
    if (empty($this->action->status < self::STATUS_IMPORTED) {
        return 'U';
    }

    return ActionCalculator::actionScore($this->action->score);//returns integer here
}

Теперь мне интересно, как я должен объявить свою функцию с типами возвращаемых

public function getAlphaScore() : string {

или же

 public function getAlphaScore() : int {

также я хочу узнать идеи / предложения / лучшие практики в такой ситуации, когда будут возвращены несколько типов возврата

/**
 * @param $compareAction
 * @return float|int|null
 */

3 ответа

"Лучшая" практика сказала бы, что лучше иметь последовательный тип возврата. Нет способа определить строгий тип возвращаемого значения, если у вас нет строгого возвращаемого типа. Таким образом, вы находитесь в этой ситуации как бы по замыслу.

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

  1. Я не совсем ясен в логике, но более уместно бросить исключение вместо возврата 0?

  2. Не отличное решение, но если первый if возвращенный null вместо 0 Вы можете использовать возвращаемый тип ?string

  3. Имеет ли смысл иметь две функции? getAlphaScoreAsIntegergetAlphaScoreAsString, В зависимости от того, что вы пытаетесь сделать, конечно

Вы не объявляете тип возвращаемого значения тогда.

Это либо string или же intВы не можете иметь оба.

Вот тут и начинает действовать слабая типизация PHP.

Я бы предложил, чтобы передовой практикой было возвращать только один тип из метода или функции, а не смешанные типы.

Предполагая, что оценка является целочисленным или строковым представлением целого числа ( 123 или "123"), затем решите, какой тип вы хотите использовать для приведения типа использования для его принудительного применения.

Так как вы возвращаете "U", я бы предложил привести его к строке. Вы можете добавить проверку, используя ctype_digit, чтобы убедиться, что ваша строка содержит только числовые символы перед ее возвратом, и, если нет, выдать исключение.

Либо верните null вместо 'U' и используйте аннотацию? Int. Строгая проверка возвращаемого значения позволит вам превратить ноль в "U".

Другие вопросы по тегам