2016-05-04 31 views
16

Ho alcuni metodi che possono restituire uno dei due tipi di ritorno - (sto usando un quadro utilizzando MCV così refactoring queste poche funzioni, in particolare, non è attraente)tipi restituire più php 7

E 'possibile dichiarare il tipo restituito restituendo uno o l'altro e non riuscendo su altro?

function test(): ? 
{ 
    if ($this->condition === false) { 
     return FailObject; 
    } 

    return SucceedObject; 
} 
+3

se entrambi 'FailObject' e' SucceedObject' condividono entrambi un'interfaccia o si estendono da un genitore comune –

risposta

35

A partire da ora, il modo supportato è che i due oggetti condividano un'interfaccia. Esempio:

interface ReturnInterface {} 
class FailObject implements ReturnInterface {} 
class SuccessObject implements ReturnInterface {} 
function test(): ReturnInterface {} 

In questo esempio, ReturnInterface è vuoto. È semplice la presenza che supporta la dichiarazione del tipo di reso necessaria.

Attenzione:
Il seguente RFC discusso (tipo Union) è stata rifiutata
https://wiki.php.net/rfc/union_types

V'è attiva, la discussione a caldo sui tipi di unione con diversi RFC competizione. Se uno di questi passano, poi una firma proposta sarebbe:

function test(): FailObject|SuccessObject {} 

Detto questo, preferisco l'approccio dell'interfaccia indipendentemente dal tipo di unione. Per me, è più chiaro e più estendibile. Se in seguito desidero uno WarnObject, ho solo bisogno di definirlo come estendente ReturnInterface - piuttosto che passare attraverso tutte le firme e aggiornarle a FailObject|SuccessObject|WarnObject.

+0

Vale la pena l'upvote per la menzione dei tipi di unione RFC –

+2

Puoi anche usare una 'classe astratta 'qui. – Andrea

+6

Questo è davvero limitante: pensate alle entit (usate, ad esempio, da Doctrine): non è possibile suggerire il ritorno a 'null | Entity'. Davvero limitante ... – Aerendir

9

Come indicato da bishop, esiste un RFC per l'aggiunta di più tipi di reso. Tuttavia, ho pensato di aggiungere che, come di PHP7.1 è ora possibile specificare un tipo di ritorno nullable in questo modo:

function exampleFunction(string $input) : ?int 
{ 
    // Do something 
} 

Quindi questa funzione avrebbe preso in una stringa e aggiungendo il punto di domanda prima di Int sei permettendogli di restituire null o un intero.

Ecco un link alla documentazione: http://php.net/manual/en/functions.returning-values.php

Ed ecco una citazione da quella pagina che spiega l'utilizzo: PHP 7.1 permette per i tipi di ritorno void e nulli facendo precedere la dichiarazione del tipo con un? - (es funzione canReturnNullorString(): stringa)

Inoltre, ecco un altro filo che si riferisce a questo: Nullable return types in PHP7