2015-04-22 19 views
25

stavo testando tipi restituiti con PHP 7.Void come tipo di ritorno

ho creato un semplice script per testare tipi restituiti di PHP 7:

<?php 

Class Obj { 

    public function __construct(){ 

    } 

    public function test(): string { //a string needs to be returned 
     return "ok"; 
    } 

} 

function foo(): Obj { //instance of Obj needs to be returned 
    return new Obj(); 
} 

$o = foo(); 
echo $o->test(); // output: ok 

Ora in altri linguaggi di programmazione quando si specifica un tipo di ritorno void significa che non è possibile restituire nulla o si otterrà un errore. Così ho scritto questo script:

<?php 

    function foo(): void { 

    } 

    foo(); 

Ora nello script sopra l'output previsto non è nulla. Invece mi dà un errore fatale:

Fatal error: Return value of foo() must be an instance of void, none returned on line 2

La mia domanda è (non ho potuto trovare), in PHP 7 ci sarà un simile void tipo?

+1

La risposta è che è stata proposta, ma non è andata molto oltre .... ed è probabile che sia un voto quasi deviante come suggerimento di tipo scalare: https://philsturgeon.uk/php/2015/02/15/php-void-much-ado-about-nothing/ –

+0

prova usando return; – Blank

+0

Sembra funzionare ora. Penso che l'abbiano aggiunto alla lingua. Ora se restituisci qualcosa quando il tipo di reso è stato dichiarato nullo, anche il linter si lamenterà. –

risposta

40

Edit:

Un nuovo RFC separato per un void return type è stato pubblicato, ha superato il voto, ed è stato realizzato in PHP 7.1.
Ora c'è un tipo di ritorno void in PHP. :)

originale del messaggio:

Tratto da wiki.php.net:

Future Work

Ideas for future work which are out of the scope of this RFC include:

  • Allow functions to declare that they do not return anything at all (void in Java and C)

Quindi attualmente non c'è modo di dichiarare che non si ritorni nulla.
Non so quale sia il migliore nella vostra situazione, ma probabilmente mi piacerebbe andare con non dichiarare il tipo di ritorno per ora.

Per rispondere alla tua domanda se ci sarà un tipo void ritorno in PHP 7:
Non c'è garanzia ancora, ma penso che sia molto probabile che void o un sinonimo saranno attuati in qualche modo.

+6

Non ci sarà alcun tipo di vuoto in PHP 7. Potrebbe essere introdotto in 7.1. – NikiC

+2

Qualche fonte per questo? – Siguza

+8

@Siguza NikiC è uno sviluppatore PHP di base. Se dice che non ci sarà alcun tipo di vuoto in PHP 7, lo crederei. – mpen

1

Non esiste un tipo equivalente per void in php, return NULL; potrebbe soddisfare i tuoi requisiti poiché non ha alcun tipo come 0 o qualsiasi altro valore. Nota: vuoto reale significa nessun ritorno.

14

Autore dei tipi di ritorno RFC qui. In PHP 7.0 non ci saranno i tipi di ritorno void dal the RFC non lo hanno aggiunto e nessuno ha fatto alcun altro RFC targeting per PHP 7.0.

Il tipo void può esistere nella serie PHP 7 se decidiamo che l'aggiunta di nuove parole chiave/riservate è accettabile per le versioni minori anche se interromperanno il codice. Questo è piuttosto incerto, ma è stato fatto in PHP 5.4 con la parola chiave callable.


Personalmente, non penso che sia necessario void; abbiamo già null. From the manual:

The special NULL value represents a variable with no value. NULL is the only possible value of type null.

In PHP una funzione che non restituisce nulla sarà implicitamente tornare null. Ciò significa che non puoi mai fare in realtà non restituire nulla *.Passare al percorso null significa che non ci sono interruzioni di compatibilità con le versioni precedenti dal null will not be a valid class/interface/trait name starting in PHP 7.0 e non aggiunge nuove chiavi o parole riservate.

* Le persone che hanno familiarità con il motore di Zend si renderanno conto che non è possibile restituire nulla, ma se non si restituisce nulla, la variabile assegnata verrà assegnata null, il che li rende logicamente equivalenti.


In PHP 7.1 ci sarà una pseudo-tipo void. È definito nello Void Return Type RFC.

Personalmente sono triste per questo perché l'autore di RFC aveva precedentemente "smesso" e avevo raccolto la RFC. Poi la prossima cosa so che è stata proposta e discussa e lei non aspetterebbe che io proponessi tipi di sindacato, che sarebbero stati la contropartita del nulla come notato sopra. Oh bene.

+3

L'ho evidenziato come una risposta utile MA 100% non è d'accordo. Sono d'accordo che "vuoto" non è necessario, ma è ** estremamente ** desiderabile. L'argomento per 'void' è semplice: fa ciò che dice, è chiaro, è leggibile. È vero che potresti essere in grado di COSTRUIRE un vuoto "ritorno" ma essere in grado di dirlo esplicitamente produrrebbe un codice MOLTO più comprensibile (ho sempre difficoltà a capire il mio codice dopo 5 giorni di distanza, figuriamoci altri). C'è sempre una spinta per brevità/istruzioni ridotte rispetto alla leggibilità. Per me leggibilità = manutenibilità che è un buon compromesso con IMHO. – BeNice

7

Il tipo di ritorno void è stato accettato per php 7.1. Quindi arriverà in futuro.

Alcuni esempi su come funzionerà:

function should_return_nothing(): void { 
    return 1; // Fatal error: A void function must not return a value 
} 

function returns_null(): void { 
    return null; // Fatal error: A void function must not return a value 
} 
function lacks_return(): void { 
    // valid 
} 
function returns_nothing(): void { 
    return; // valid 
} 

vedere la RFC from Andrea Faulds per maggiori informazioni!

+0

Sembra funzionare ora, penso che l'abbiano aggiunto alla lingua. –

+0

In realtà questo è abbastanza bello, anche il linter ora si lamenterà se si tenta di restituire qualcosa quando il tipo di reso è stato dichiarato nullo. –

Problemi correlati