dcc
@dcc
junior

Тип возвращаемых значений метода. Как правильно?

Всем привет.
Должен ли метод возвращать только один тип данных?
Например:
public function foo($obj)
    {
        if ($obj->isNotActive()) {
            return false;
        }
        //другие действия с объектом
        return $obj;
    }


возможен ли такой подход? или Метод должен вернуть либо булев, либо сам объект?
  • Вопрос задан
  • 86 просмотров
Решения вопроса 4
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Мне видится предпочтительней вариант с возвратом исключения:
public function foo($obj) {
    if ($obj->isNotActive()) {
        throw new Exception('Not active.');
    }
    //другие действия с объектом
    return $obj;
}

try {
    foo($obj);
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Зависит от сценария.
Судя по коду, отсутствие активности - это не ошибка.
То есть в данном случае можно вернуть null.

А вот функции, которые возвращают false в случае ошибки устарели 20 лет назад. И если метод должен вернуть объект, но не может, то он должен кинуть исключение
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Исключение здесь, вероятно, лишним будет.
Вместо false лучше вернуть null.
И расставить typehint.
public function foo(SomeClass $obj): ?SomeClass
    {
        if ($obj->isNotActive()) {
            return null;
        }
        //другие действия с объектом
        return $obj;
    }
Ответ написан
Комментировать
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
Да, такой подход возможен. И даже активно используется в стандартной библиотеке PHP.

Другой вариант - бросать исключение.

Третий вариант - возвращать массив из 2 значений:
public function foo($obj) {
    if ($obj->isNotActive()) {
        return [null, false];
    }
    //другие действия с объектом
    return [$obj, true];
}
...
[$result, $status] = $obj->foo(...);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы