У меня есть некоторые методы, которые могут возвращать один из двух типов возврата – (я использую фреймворк с использованием MCV, поэтому рефакторинг этих нескольких функций, в частности, не привлекателен)
Можно ли объявить возвращаемый тип, возвращающий один или другой, и не выполнить что-либо еще?
function test(): ? { if ($this->condition === false) { return FailObject; } return SucceedObject; }
На данный момент поддерживаемый способ состоит в том, чтобы два объекта могли совместно использовать интерфейс. Пример:
interface ReturnInterface {} class FailObject implements ReturnInterface {} class SuccessObject implements ReturnInterface {} function test(): ReturnInterface {}
В этом примере ReturnInterface
пуст. Простое присутствие поддерживает декларацию требуемого типа.
Предупреждение :
Следующие обсуждаемые RFC (типы Союза) были отклонены
https://wiki.php.net/rfc/union_types
Существует активная, горячая дискуссия о типах профсоюзов с несколькими конкурирующими RFC. Если какая-либо из них пройдет, то предлагаемая подпись будет:
function test(): FailObject|SuccessObject {}
Тем не менее, я предпочитаю интерфейсный подход независимо от типов профсоюзов. Для меня это более понятно и более расширяемо. Если позже я хочу WarnObject
мне просто нужно определить его как расширение ReturnInterface
– вместо того, чтобы проходить через все подписи и обновлять их до FailObject|SuccessObject|WarnObject
.
Как отметил епископ, существует RFC для добавления нескольких типов возврата. Тем не менее, я думал, что добавлю, что с PHP7.1 теперь вы можете указать тип возвращаемого значения типа:
function exampleFunction(string $input) : ?int { // Do something }
Таким образом, эта функция будет принимать строку и добавив вопросительный знак до того, как вы позволите ему вернуть нуль или целое число.
Вот ссылка на документацию: http://php.net/manual/en/functions.returning-values.php
И вот цитата из этой страницы, объясняющая использование: PHP 7.1 допускает типы void и null return, предшествующие объявлению типа с помощью? – (например, функция canReturnNullorString ():? String)
Кроме того, вот еще один поток, который относится к этому: Nullable возвращаемые типы в PHP7
PHP 7.2 теперь поддерживает тип возвращаемого объекта
http://php.net/manual/en/migration72.new-features.php
function test(object $obj) : object // return any type of object ...